Probleme de requete SQL.

Probleme de requete SQL. - SQL/NoSQL - Programmation

Marsh Posté le 26-02-2004 à 10:58:21    

Salut!
J''essaye une requete qui est syntaxitiquement correct apparament mais elle ne renvoi rien SI la table guerre est vide. Bizarre non ?
voici ma requete
SELECT village.village,village.id,village.pseudo FROM village,guerre WHERE village.neutre='0' and village.village !='BinarySmil' and guerre.villageattaquer!=village.village LIMIT 0, 30
 
 
voici mes tables:
Village:
Village              Neutre
BinarySmil             0
Dav007                 0
 
Guerre: Aucun enregistrement
 
Normalement il devrait me renvoyer dav007 (et les champs qui vont avec)
mais je ne recois rien :(
 
Seulement si je mets un enregistrement dans ma table guerre, meme vide, là, ca marche.
Je pourrais le faire sans que sa crée des bug mais je prefere quelque de plus propre
 
 
Merci d'avance


---------------
AfterEnd: Batissez un nouveau monde
Reply

Marsh Posté le 26-02-2004 à 10:58:21   

Reply

Marsh Posté le 26-02-2004 à 11:33:35    

Puisque ta table guerre est vide, il faut d'apres moi que tu utilises le (+) pour qu'il te renvoie le résutat de ta requete

Reply

Marsh Posté le 26-02-2004 à 11:37:11    

(+) ? je le mets ou le (+) ?


---------------
AfterEnd: Batissez un nouveau monde
Reply

Marsh Posté le 26-02-2004 à 11:38:22    

SmilM a écrit :


 
SELECT village.village,village.id,village.pseudo FROM village,guerre WHERE village.neutre='0' and village.village !='BinarySmil'  
and guerre.villageattaquer!=village.village  
LIMIT 0, 30
 


 
je pense que si ta table guerre est vide, ta requete ne peu evaluer la derniere condition, et comme y'a un and, ca fout tout le reste en l'air.

Reply

Marsh Posté le 26-02-2004 à 11:40:43    

boulax a écrit :


 
je pense que si ta table guerre est vide, ta requete ne peu evaluer la derniere condition, et comme y'a un and, ca fout tout le reste en l'air.


 
Ya donc pas de solutions a part crée un enregistrement vide ?
non ?


---------------
AfterEnd: Batissez un nouveau monde
Reply

Marsh Posté le 26-02-2004 à 11:42:38    

SmilM a écrit :


 
Ya donc pas de solutions a part crée un enregistrement vide ?
non ?


 
bah tu pourrais extraire ce que tu veux sans la condition sur GUERRE et ensuite faire une dernirere requete pour tesrer dans GUERRE non?
 
mais je sais pas si ca resoudrait ton pb

Reply

Marsh Posté le 26-02-2004 à 11:43:21    

moi quand j'ai un pb j'essai toujours de decouper mes requetes en plusieurs pour voir ou ca cloche

Reply

Marsh Posté le 26-02-2004 à 11:51:21    

Je fais comme toi saxgard.
 
Je pense que boulax a raison.
Avec une table vide, on ne peut peut etre pas faire de test comme ca...
 
J'attends d'autres réponses.


---------------
AfterEnd: Batissez un nouveau monde
Reply

Marsh Posté le 26-02-2004 à 11:53:44    

SmilM a écrit :

Je fais comme toi saxgard.
 
Je pense que boulax a raison.
Avec une table vide, on ne peut peut etre pas faire de test comme ca...
 
J'attends d'autres réponses.
 


 
pourquoi tu met pas une autre condiion dans ta requete avec un "OR " en plus  dans le cas  ou c vide

Reply

Marsh Posté le 26-02-2004 à 11:55:41    

bug hunter a écrit :

Puisque ta table guerre est vide, il faut d'apres moi que tu utilises le (+) pour qu'il te renvoie le résutat de ta requete


 
à mon avis, il n'utilise pas oracle ;)

Reply

Marsh Posté le 26-02-2004 à 11:55:41   

Reply

Marsh Posté le 26-02-2004 à 12:03:10    

gizmo a écrit :


 
à mon avis, il n'utilise pas oracle ;)


D'accord, désolé

Reply

Marsh Posté le 26-02-2004 à 14:13:53    


SELECT village.village,village.id,village.pseudo FROM village,guerre WHERE village.neutre='0' and village.village !='BinarySmil' and village.village not in (
          select villageattaquer from guerre );

 LIMIT 0, 30  

 
 
Si j'ai bien compris, c'est ce que tu cherches a avoir ?


Message édité par boulax le 26-02-2004 à 14:14:47
Reply

Marsh Posté le 26-02-2004 à 14:38:43    

mes yeux... :sweat:
 
RIGHT OUTER JOIN :fou:
 
http://wombat.doc.ic.ac.uk/foldoc/ [...] outer+join
 
Franchement, quand vous savez pas, répondez pas n'importe quoi, ménagez mon coeur... Surtout que c'est au moins deux fois par semaine la même chose...

Reply

Marsh Posté le 26-02-2004 à 14:40:06    

PS: l'astuce du *= - MSSQL Server - ou (+)= - Oracle - ne s'applique pas à MySQL qui ne supporte pas ces raccourcis.

Reply

Marsh Posté le 26-02-2004 à 14:41:04    

boulax a écrit :


SELECT village.village,village.id,village.pseudo FROM village,guerre WHERE village.neutre='0' and village.village !='BinarySmil' and village.village not in (
          select villageattaquer from guerre );

 LIMIT 0, 30  

 
 
Si j'ai bien compris, c'est ce que tu cherches a avoir ?


 
Je^pense que c'est quelque chose comme ca oui :)
Seulement je suis sous MYSQL, spas de la requete imbriqué ca ?
 
On va voir ce que raconte MagicBuz:d sinon il va me tapper


Message édité par smilm le 26-02-2004 à 14:53:00

---------------
AfterEnd: Batissez un nouveau monde
Reply

Marsh Posté le 26-02-2004 à 14:47:06    

MagicBuzz a écrit :

mes yeux... :sweat:
 
RIGHT OUTER JOIN :fou:
 
http://wombat.doc.ic.ac.uk/foldoc/ [...] outer+join
 
Franchement, quand vous savez pas, répondez pas n'importe quoi, ménagez mon coeur... Surtout que c'est au moins deux fois par semaine la même chose...


 
bah quand on a pas une solution immediate comme celle que tu propose faut bien essayer par d'autres moyens  ;)

Reply

Marsh Posté le 26-02-2004 à 14:52:12    

saxgard a écrit :


bah quand on a pas une solution immediate comme celle que tu propose faut bien essayer par d'autres moyens  ;)


bah nan mais c'est surtout que j'ai répondu à la même questions, après les mêmes trucs de oufs pas plus tard que lundi, alors c'est pour ça...
 
le outer join est très chiant à utiliser, mais quand on le maîtrise c'est terrible comme ça simplifie la vie :)
 
un peu comme les fonctions d'agregation et le group by en somme ;)

Reply

Marsh Posté le 26-02-2004 à 14:55:49    

MagicBuzz a écrit :


bah nan mais c'est surtout que j'ai répondu à la même questions, après les mêmes trucs de oufs pas plus tard que lundi, alors c'est pour ça...
 
le outer join est très chiant à utiliser, mais quand on le maîtrise c'est terrible comme ça simplifie la vie :)
 
un peu comme les fonctions d'agregation et le group by en somme ;)


 
ouais j'imagine, je maitrise pas tt ca, le group by me prend souvent la tete   :)  , mais bon sois disans ce prendre la tete  c'ets ce qui fait la joie des informaticiens non?  ;)  
 
 
 

Reply

Marsh Posté le 26-02-2004 à 15:01:18    

bah ça dépends des cas.
 
j'aime bien me prendre la tête sur un algo.
 
mais ça me lourde grandement quand j'ai l'algo en tête, mais que je m'acherne sur des problèmes de syntaxe (actuellement une expression régulière qui veut pas marcher par exemple...)

Reply

Marsh Posté le 26-02-2004 à 15:12:50    

Code :
  1. SELECT village.village,village.id,village.pseudo FROM village LEFT JOIN guerre ON village.village!=guerre.villageattaquer WHERE village.neutre='0' AND village.village!='$village->village'


 
Merci!!
 
1er fois que j'utilise ce truc.
La doc de mon bookin sur  les jointures externes est trés bien =>"Pratique de MYSQL et PHP"


---------------
AfterEnd: Batissez un nouveau monde
Reply

Marsh Posté le 26-02-2004 à 15:15:11    

elle est chelou la syntaxe de ta requête, y'a même pas indiqué que c'est une outer join :heink: :??:
 
m'enfin si ça marche c'est le principal ;)

Reply

Marsh Posté le 26-02-2004 à 15:29:23    

MagicBuzz a écrit :

elle est chelou la syntaxe de ta requête, y'a même pas indiqué que c'est une outer join :heink: :??:
 
m'enfin si ça marche c'est le principal ;)


 
Heu voui effectivement,mais j'ai testé, ca marche.


---------------
AfterEnd: Batissez un nouveau monde
Reply

Marsh Posté le 10-03-2004 à 15:14:34    

SmilM a écrit :


 
Heu voui effectivement,mais j'ai testé, ca marche.


 
Finalement ca ne marche plus trés bien...
Ma requete:

Code :
  1. SELECT village.village, village.id, village.pseudo FROM village LEFT OUTER JOIN guerre ON village.village!=guerre.villageattaquer WHERE village.neutre='0' AND village.pseudo!='$village->pseudo'


 
La synthaxe est apparament correct seulement cette requete me renvoi plusieurs fois les memes enregistrements.
 
 
      BinarySmil 1 SmilM  
      BinarySmil 1 SmilM  
      TetdepomCity 11 tetdepom  
      TetdepomCity 11 tetdepom  
      TetdepomCity 11 tetdepom  
      BGCity 12 Ruru  
      BGCity 12 Ruru  
      BGCity 12 Ruru  
 
Ect....
 
Y'aurai pas une clause pour qu'il ne renvoi pas de doublons ?
 
C'est bizarre cette réaction non ? ca marchai bien ya quelques jours...
 

Reply

Marsh Posté le 10-03-2004 à 15:31:25    

ca sentirais pas le group by ca??

Reply

Marsh Posté le 10-03-2004 à 15:34:01    

axl63800 a écrit :

ca sentirais pas le group by ca??


j'étais justement en train de regarder la doc du groupe by mais bon...je sais pas si ca sent le groupe by "ca" :)

Reply

Marsh Posté le 10-03-2004 à 15:40:08    

SmilM a écrit :


j'étais justement en train de regarder la doc du groupe by mais bon...je sais pas si ca sent le groupe by "ca" :)


 
Ca sent meme pas du tout le group by...

Reply

Marsh Posté le 10-03-2004 à 17:06:12    

:bounce:

Reply

Marsh Posté le 10-03-2004 à 17:14:51    

distinct?


---------------
What if I were smiling and running into your arms? Would you see then what I see now?  
Reply

Marsh Posté le 15-03-2004 à 18:08:19    


 
Heu voui j'avais oublié de répondre,avec le distinct plus de doublons.
 
Apparament maintenant que j'ai plusieurs enregistrement dans ma table guerre, ma requete n'est plus fonctionnel.
Je m'explique:
j'ai toujours 2 tables, village et guerre et je veux selectionner tout les village qui ne sont pas neutre(neutre=0), qui ne sont pas un de mes village et qui ne sont actuellement pas en guerre.
 
Donc ma requete actuel :

Code :
  1. SELECT DISTINCT village.village, village.id, village.pseudo FROM village LEFT OUTER JOIN guerre ON village.village!=guerre.villageattaquer WHERE village.neutre='0' AND village.pseudo!='$village->village'


Hélas ca ne marche pas :(
Il renvoi les enregistrement dont village.village=guerre.villageattaquer ....
La jointure deconnerait ?
 
Merci d'avance
(si je suis pas clair, dites le, je vous montrerais un exemple plus concret)


---------------
AfterEnd: Batissez un nouveau monde
Reply

Marsh Posté le 16-03-2004 à 18:54:08    

Reply

Marsh Posté le 16-03-2004 à 20:22:22    

j'ai aps tout compris :pt1cable:  
Y a quoi comme colonnes dans la table "guerre" :??:

Reply

Marsh Posté le 16-03-2004 à 20:39:01    

mrbebert a écrit :

j'ai aps tout compris :pt1cable:  
Y a quoi comme colonnes dans la table "guerre" :??:  


 
lol ok je reprends:
 
Nous avons 2 tables, village et guerre.
 
Dans guerre tu as  les champs "id ;villageattaquer; villageattaquant; pseudo;" et d'autres sans importance.
 
En fait ce que je veux c'est que les village que l'on selectionne ne soit pas des village actuellement en train de se faire attaquer "villageattaquer"..
Donc je fais une jointure avec
village.village!=guerre.villageattaquer
 
Seulement ca marche pas  :sweat:


---------------
AfterEnd: Batissez un nouveau monde
Reply

Marsh Posté le 16-03-2004 à 20:42:42    

Essaie ca :
SELECT village.*
FROM village
LEFT JOIN guerre ON guerre.villageattaquant=village.village
WHERE guerre.id IS NULL
 [:figti]

Reply

Marsh Posté le 16-03-2004 à 20:52:42    

mrbebert a écrit :

Essaie ca :
SELECT village.*
FROM village
LEFT JOIN guerre ON guerre.villageattaquant=village.village
WHERE guerre.id IS NULL
 [:figti]  


 
Merci!
Ca donne plutot ca:
 
SELECT village.village, village.id, village.pseudo
FROM village
LEFT JOIN guerre ON guerre.villageattaquer = village.village
WHERE village.neutre = '0' AND guerre.id IS NULL
 
Mais ca a l'air de marcher :)


---------------
AfterEnd: Batissez un nouveau monde
Reply

Marsh Posté le 16-03-2004 à 20:57:12    

oui, c'est mieux :pt1cable:


Message édité par mrbebert le 16-03-2004 à 20:57:25
Reply

Marsh Posté le 16-03-2004 à 21:56:18    

mrbebert a écrit :

oui, c'est mieux :pt1cable:  


 
Mais j'ai pas trop compris le guerre.id IS NULL
On selectionne meme pas de champ guerre..enfin je comprends pas...c bizarre....mais ca marche apparament
 
(Un bookin sur le SQL m'aiderai a comprendre ?)

Reply

Marsh Posté le 16-03-2004 à 22:02:23    

Le LEFT JOIN est un peu différent d'une jointure normale.
Dans une jointure, tu gardes uniquement les lignes qui "correspondent", alors qu'avec le LEFT JOIN, tu gardes quand même la ligne de gauche s'il n'y a pas d'équivalent (dans ce cas, les champs correspondants sont mis à NULL pour la table de droite).
 
La requête peut donc se lire de la façon suivante :
- pour chaque ligne de "village", y rattacher la/les ligne(s) qui correspondent (avec la condition guerre.villageattaquer=village.village)
- conserver seulement les lignes qui n'ont pas trouvé leur correspondant dans "guerre"
 
Dis autrement :
- rattacher à chaque "village" la "guerre" qui les a attaqué
- garder seulement les villages qui n'en ont pas
 
Essaie de comparer les requêtes suivantes :
SELECT *  
FROM village  
LEFT JOIN guerre ON guerre.villageattaquer = village.village  
 
SELECT *  
FROM village, guerre
WHERE guerre.villageattaquer = village.village


Message édité par mrbebert le 16-03-2004 à 22:03:56
Reply

Marsh Posté le 16-03-2004 à 22:07:55    

Whaou
En fait on passe par un moyen un peu detourné du truc ?
Tu selectionne plein de chose et tu filtre avec le where
Enfin j'ai compris... il attache village.village avec guerre.villageattaquer , que l'égalité soit fausse ou pas et si c faux ca renvoi NULL, donc on fait un IS NULL
 
merci de l'explication...enfin je l'ai repris pi etre trés bizarrement mais je crois avoir compris. C'est cool, merci.
 
Un bookin sur le SQL ca vaut le coup dans mon cas ou les copains d'HFR suffisent ? :d

Reply

Marsh Posté le 16-03-2004 à 22:14:47    

SmilM a écrit :

Whaou
En fait on passe par un moyen un peu detourné du truc ?
Tu selectionne plein de chose et tu filtre avec le where
Enfin j'ai compris... il attache village.village avec guerre.villageattaquer , que l'égalité soit fausse ou pas et si c faux ca renvoi NULL, donc on fait un IS NULL
 
merci de l'explication...enfin je l'ai repris pi etre trés bizarrement mais je crois avoir compris. C'est cool, merci.
 
Un bookin sur le SQL ca vaut le coup dans mon cas ou les copains d'HFR suffisent ? :d
 

non, c'est pas tout fait ca ;)  
Avec une jointure normale, il attache les lignes ou l'égalité est vraie. S'il n'y a aucune égalité, la ligne de village n'apparaitra pas dans le résultat (puisqu'aucune ligne ne respecte village.village=guerre.villageattaquer)
 
Avec le LEFT JOIN, il attache aussi uniquement les lignes qui respectent l'égalité (il peut y en avoir 1 ou plusieurs, auquels cas tout se passe comme pour la jointure). Mais s'il n'y en a pas, il garde tout de même la ligne de "village", en lui rattachant une fausse ligne de "guerre", avec tout les champs à NULL ;)


Message édité par mrbebert le 16-03-2004 à 22:15:37
Reply

Marsh Posté le 16-03-2004 à 22:17:17    

mrbebert a écrit :

Le LEFT JOIN est un peu différent d'une jointure normale.
Dans une jointure, tu gardes uniquement les lignes qui "correspondent", alors qu'avec le LEFT JOIN, tu gardes quand même la ligne de gauche s'il n'y a pas d'équivalent (dans ce cas, les champs correspondants sont mis à NULL pour la table de droite).
 
La requête peut donc se lire de la façon suivante :
- pour chaque ligne de "village", y rattacher la/les ligne(s) qui correspondent (avec la condition guerre.villageattaquer=village.village)
- conserver seulement les lignes qui n'ont pas trouvé leur correspondant dans "guerre"
 
Dis autrement :
- rattacher à chaque "village" la "guerre" qui les a attaqué
- garder seulement les villages qui n'en ont pas
 
Essaie de comparer les requêtes suivantes :
SELECT *  
FROM village  
LEFT JOIN guerre ON guerre.villageattaquer = village.village  
 
SELECT *  
FROM village, guerre
WHERE guerre.villageattaquer = village.village


 
 
SELECT *  
FROM village  
LEFT JOIN guerre ON guerre.villageattaquer = village.village  
Me renvoi tout les enregistrement de ma table
 
SELECT *  
FROM village, guerre
WHERE guerre.villageattaquer = village.village
Me renvoi les village ou guerre.villageattaquer = village.village

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed