Probleme de requete SQL. - SQL/NoSQL - Programmation
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
Marsh Posté le 26-02-2004 à 11:37:11
ReplyMarsh Posté le 26-02-2004 à 11:38:22
SmilM 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.
Marsh Posté le 26-02-2004 à 11:40:43
boulax a écrit : |
Ya donc pas de solutions a part crée un enregistrement vide ?
non ?
Marsh Posté le 26-02-2004 à 11:42:38
SmilM a écrit : |
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
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
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.
Marsh Posté le 26-02-2004 à 11:53:44
SmilM a écrit : Je fais comme toi saxgard. |
pourquoi tu met pas une autre condiion dans ta requete avec un "OR " en plus dans le cas ou c vide
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
Marsh Posté le 26-02-2004 à 12:03:10
ReplyMarsh 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 ?
Marsh Posté le 26-02-2004 à 14:38:43
mes yeux...
RIGHT OUTER JOIN
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...
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.
Marsh Posté le 26-02-2004 à 14:41:04
boulax a écrit : |
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 sinon il va me tapper
Marsh Posté le 26-02-2004 à 14:47:06
MagicBuzz a écrit : mes yeux... |
bah quand on a pas une solution immediate comme celle que tu propose faut bien essayer par d'autres moyens
Marsh Posté le 26-02-2004 à 14:52:12
saxgard 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
Marsh Posté le 26-02-2004 à 14:55:49
MagicBuzz a écrit : |
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?
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...)
Marsh Posté le 26-02-2004 à 15:12:50
Code :
|
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"
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
m'enfin si ça marche c'est le principal
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 |
Heu voui effectivement,mais j'ai testé, ca marche.
Marsh Posté le 10-03-2004 à 15:14:34
SmilM a écrit : |
Finalement ca ne marche plus trés bien...
Ma requete:
Code :
|
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...
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"
Marsh Posté le 10-03-2004 à 15:40:08
SmilM a écrit : |
Ca sent meme pas du tout le group by...
Marsh Posté le 10-03-2004 à 17:14:51
distinct?
Marsh Posté le 15-03-2004 à 18:08:19
JagStang a écrit : distinct? |
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 :
|
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)
Marsh Posté le 16-03-2004 à 20:22:22
j'ai aps tout compris
Y a quoi comme colonnes dans la table "guerre"
Marsh Posté le 16-03-2004 à 20:39:01
mrbebert a écrit : j'ai aps tout compris |
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
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
Marsh Posté le 16-03-2004 à 20:52:42
mrbebert a écrit : Essaie ca : |
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
Marsh Posté le 16-03-2004 à 20:57:12
oui, c'est mieux
Marsh Posté le 16-03-2004 à 21:56:18
mrbebert a écrit : oui, c'est mieux |
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 ?)
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
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 ?
Marsh Posté le 16-03-2004 à 22:14:47
SmilM a écrit : Whaou |
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
Marsh Posté le 16-03-2004 à 22:17:17
mrbebert a écrit : Le LEFT JOIN est un peu différent d'une jointure normale. |
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
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