Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2003 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Probleme de requete SQL.

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Précédente
Auteur Sujet :

Probleme de requete SQL.

n°655960
smilm
Posté le 26-02-2004 à 10:58:21  profilanswer
 

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
mood
Publicité
Posté le 26-02-2004 à 10:58:21  profilanswer
 

n°655993
bug hunter
Place aux experts
Posté le 26-02-2004 à 11:33:35  profilanswer
 

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

n°656001
smilm
Posté le 26-02-2004 à 11:37:11  profilanswer
 

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


---------------
AfterEnd: Batissez un nouveau monde
n°656007
boulax
Inserer phrase hype en anglais
Posté le 26-02-2004 à 11:38:22  profilanswer
 

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.

n°656012
smilm
Posté le 26-02-2004 à 11:40:43  profilanswer
 

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
n°656018
saxgard
Posté le 26-02-2004 à 11:42:38  profilanswer
 

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

n°656020
saxgard
Posté le 26-02-2004 à 11:43:21  profilanswer
 

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

n°656040
smilm
Posté le 26-02-2004 à 11:51:21  profilanswer
 

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
n°656046
saxgard
Posté le 26-02-2004 à 11:53:44  profilanswer
 

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

n°656051
gizmo
Posté le 26-02-2004 à 11:55:41  profilanswer
 

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 ;)

mood
Publicité
Posté le 26-02-2004 à 11:55:41  profilanswer
 

n°656060
bug hunter
Place aux experts
Posté le 26-02-2004 à 12:03:10  profilanswer
 

gizmo a écrit :


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


D'accord, désolé

n°656228
boulax
Inserer phrase hype en anglais
Posté le 26-02-2004 à 14:13:53  profilanswer
 


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
n°656297
MagicBuzz
Posté le 26-02-2004 à 14:38:43  profilanswer
 

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...

n°656303
MagicBuzz
Posté le 26-02-2004 à 14:40:06  profilanswer
 

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

n°656310
smilm
Posté le 26-02-2004 à 14:41:04  profilanswer
 

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
n°656320
saxgard
Posté le 26-02-2004 à 14:47:06  profilanswer
 

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  ;)

n°656331
MagicBuzz
Posté le 26-02-2004 à 14:52:12  profilanswer
 

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 ;)

n°656338
saxgard
Posté le 26-02-2004 à 14:55:49  profilanswer
 

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?  ;)  
 
 
 

n°656345
MagicBuzz
Posté le 26-02-2004 à 15:01:18  profilanswer
 

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...)

n°656356
smilm
Posté le 26-02-2004 à 15:12:50  profilanswer
 

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
n°656361
MagicBuzz
Posté le 26-02-2004 à 15:15:11  profilanswer
 

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 ;)

n°656381
smilm
Posté le 26-02-2004 à 15:29:23  profilanswer
 

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
n°669741
smilm
Posté le 10-03-2004 à 15:14:34  profilanswer
 

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...
 

n°669780
axl63800
Posté le 10-03-2004 à 15:31:25  profilanswer
 

ca sentirais pas le group by ca??

n°669785
smilm
Posté le 10-03-2004 à 15:34:01  profilanswer
 

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" :)

n°669804
smilm
Posté le 10-03-2004 à 15:40:08  profilanswer
 

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...

n°669908
smilm
Posté le 10-03-2004 à 17:06:12  profilanswer
 

:bounce:

n°669919
jagstang
Pa Capona ಠ_ಠ
Posté le 10-03-2004 à 17:14:51  profilanswer
 

distinct?


---------------
What if I were smiling and running into your arms? Would you see then what I see now?  
n°674373
smilm
Posté le 15-03-2004 à 18:08:19  profilanswer
 


 
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
n°675267
smilm
Posté le 16-03-2004 à 18:54:08  profilanswer
 
n°675354
mrbebert
Posté le 16-03-2004 à 20:22:22  profilanswer
 

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

n°675365
smilm
Posté le 16-03-2004 à 20:39:01  profilanswer
 

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
n°675370
mrbebert
Posté le 16-03-2004 à 20:42:42  profilanswer
 

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

n°675378
smilm
Posté le 16-03-2004 à 20:52:42  profilanswer
 

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
n°675381
mrbebert
Posté le 16-03-2004 à 20:57:12  profilanswer
 

oui, c'est mieux :pt1cable:


Message édité par mrbebert le 16-03-2004 à 20:57:25
n°675403
smilm
Posté le 16-03-2004 à 21:56:18  profilanswer
 

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 ?)

n°675412
mrbebert
Posté le 16-03-2004 à 22:02:23  profilanswer
 

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
n°675421
smilm
Posté le 16-03-2004 à 22:07:55  profilanswer
 

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

n°675433
mrbebert
Posté le 16-03-2004 à 22:14:47  profilanswer
 

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
n°675439
smilm
Posté le 16-03-2004 à 22:17:17  profilanswer
 

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

mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Précédente

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Probleme de requete SQL.

 

Sujets relatifs
Problème requête SQL (Ms SQL 2000)Problème de compréhension d' une requête SQL
Problème de requête SQL dans un prog. en VBProblème dans une requête SQL
Probleme avec une requete SQL: je ne sais pas comment faire...![SQL server] Problème de requête [--RESOLVED--]
[ASP] Problème de date dans requête SQLRequête SQL sur controle ADO - Problème
probleme d'affichage lors d'1 requete SQL[SQL]probleme avec une requete
Plus de sujets relatifs à : Probleme de requete SQL.


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR