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

 


 Mot :   Pseudo :  
 
 Page :   1  2  3
Page Suivante
Auteur Sujet :

SQL, : Je n'arrive pas à formuler la requète qui va bien...

n°332455
mrbebert
Posté le 13-03-2003 à 20:11:35  profilanswer
 

Reprise du message précédent :
Tiens non, il y a une requête en moins que ce que je pensais :)  
On devrait pouvoir s'en sortir avec quelque chose dans le genre :
SELECT eleve.*, r2.*
FROM eleve, remarques AS r1, remarques AS r2
WHERE r1.rem = 'remarque_qu_on_veut_pas'
AND eleve.id <> r1.id
AND r2.id = eleve.id


Message édité par mrbebert le 13-03-2003 à 20:12:11
mood
Publicité
Posté le 13-03-2003 à 20:11:35  profilanswer
 

n°332521
ZeBorG
Yes we can!
Posté le 13-03-2003 à 20:38:04  profilanswer
 

mrBebert > j'ai testé ta solution :
 
SELECT eleve.id, eleve.nom, r2.rem
FROM eleve, remarques AS r1, remarques AS r2
WHERE r1.rem = 'bla1' AND eleve.id != r1.id AND r2.id = eleve.id
 
et j'obtiens ça :
 
id | nom | rem
--------------
2 | titi | bla3
 
pour rappel, les deux tables sont ;
 
eleve :
id | nom
--------------
1 | toto
2 | titi
3 | tata
 
remarques :
id | rem
--------------
1 | bla1
1 | bla2
2 | bla3
 
il me manque donc 'tata' qui n'a pourtant pas la remarque 'bla1'


Message édité par ZeBorG le 13-03-2003 à 20:38:46
n°332523
ZeBorG
Yes we can!
Posté le 13-03-2003 à 20:41:35  profilanswer
 

solution :
 
SELECT eleve.id, eleve.nom, r2.rem
FROM eleve, remarques AS r1 LEFT JOIN remarques AS r2 ON r2.id = eleve.id
WHERE r1.rem = 'bla1' AND eleve.id != r1.id
 
 
comme vous pouvez le voir ici :
http://wanab.free.fr/test/test.php

n°332532
mrbebert
Posté le 13-03-2003 à 20:45:15  profilanswer
 

ZeBorG a écrit :

solution :
 
SELECT eleve.id, eleve.nom, r2.rem
FROM eleve, remarques AS r1 LEFT JOIN remarques AS r2 ON r2.id = eleve.id
WHERE r1.rem = 'bla1' AND eleve.id != r1.id
 
 
comme vous pouvez le voir ici :
http://wanab.free.fr/test/test.php

:cry:  :cry:  
C'était évident qu'il fallait un LEFT JOIN :sweat:

n°332534
skylight
Made in France.
Posté le 13-03-2003 à 20:46:02  profilanswer
 

mrBebert a écrit :

:cry:  :cry:  
C'était évident qu'il fallait un LEFT JOIN :sweat:  

:D

n°332538
MagicBuzz
Posté le 13-03-2003 à 20:50:11  profilanswer
 

Pfff... C même pas un LEFT OUTER JOIN :/

n°332541
mrbebert
Posté le 13-03-2003 à 20:53:22  profilanswer
 

MagicBuzz a écrit :

Pfff... C même pas un LEFT OUTER JOIN :/

c'est quoi la différence :??:

n°332543
ZeBorG
Yes we can!
Posté le 13-03-2003 à 20:54:49  profilanswer
 

En tout cas, merci à tous pour m'avoir aidé. :jap:  :)

n°332551
ZeBorG
Yes we can!
Posté le 13-03-2003 à 21:00:48  profilanswer
 

Apparemment, il y a moyen d'optimiser
http://dev.nexen.net/docs/mysql/an [...] l_JOIN.php
 
mysql> select * from table1,table2 where table1.id=table2.id;
mysql> select * from table1 LEFT JOIN table2 ON table1.id=table2.id;
mysql> select * from table1 LEFT JOIN table2 USING (id);
mysql> select * from table1 LEFT JOIN table2 ON table1.id=table2.id
LEFT JOIN table3 ON table2.id=table3.id;
mysql> select * from table1 USE INDEX (key1,key2) WHERE key1=1 et key2=2 AND
key3=3;
mysql> select * from table1 IGNORE INDEX (key3) WHERE key1=1 et key2=2 AND
key3=3;
 
 
vous avez des remaques ?

n°332556
ZeBorG
Yes we can!
Posté le 13-03-2003 à 21:06:59  profilanswer
 

c'est mieux d'écrire :
 
SELECT *  
FROM table1 LEFT JOIN table2 ON table1.id=table2.id
 
ou ça ? :
 
SELECT *  
FROM table1 LEFT JOIN table2 USING (id)
 
Si ça reviens au même, la 2nd alternative est plus élégante non ?
 
et si il y à plusieurs jointures :
 
SELECT *  
FROM table1
 LEFT JOIN table2 ON table1.id=table2.id
 LEFT JOIN table3 ON table1.id=table3.id
 LEFT JOIN table4 ON table1.id=table4.id
...
 
c'est possible ça ? :
 
SELECT *  
FROM table1
 LEFT JOIN table2 USING (id)
 LEFT JOIN table3 USING (id)
 LEFT JOIN table4 USING (id)
...


Message édité par ZeBorG le 13-03-2003 à 21:07:56
mood
Publicité
Posté le 13-03-2003 à 21:06:59  profilanswer
 

n°332561
skylight
Made in France.
Posté le 13-03-2003 à 21:09:48  profilanswer
 

C'est exactement la meme chose :)
 
certains prefereront ne pas utiliser le USING, pour des raisons de lisibilité, ou en utilisation de plus de 2 tables avec des champs de meme noms

n°332562
mrbebert
Posté le 13-03-2003 à 21:10:16  profilanswer
 

Je crois que c'est identique. Juste une notation différente :)

n°332595
MagicBuzz
Posté le 13-03-2003 à 21:35:05  profilanswer
 

mrBebert a écrit :

c'est quoi la différence :??:  


Chais plus exactement.
 
Le LEFT JOIN retourne toutes les lignes de droit qui sont une liaison à gauche, plus toutes les lignes de gauche.
 
Le LEFT OUTER JOIN retourne toutes les lignes de droite et toutes les lignes de gauche.
 
Ou un truc du genre...

n°334208
ZeBorG
Yes we can!
Posté le 15-03-2003 à 21:54:45  profilanswer
 

ZeBorG a écrit :

solution :
 
SELECT eleve.id, eleve.nom, r2.rem
FROM eleve, remarques AS r1 LEFT JOIN remarques AS r2 ON r2.id = eleve.id
WHERE r1.rem = 'bla1' AND eleve.id != r1.id
 

Je viens de me rendre compte de quelque chose : Cette solution marche pour des petites tables mais pour des tables à 50000+ entrées, bonjour les dégats !
 
C'est comme faire :
 
SELECT table1.id
FROM table1, table2
WHERE table1.id != table2.id
 
qq à une autre solution ?

n°334275
Mara's dad
Yes I can !
Posté le 16-03-2003 à 00:41:41  profilanswer
 

ZeBorG a écrit :

Je viens de me rendre compte de quelque chose : Cette solution marche pour des petites tables mais pour des tables à 50000+ entrées, bonjour les dégats !
 
C'est comme faire :
 
SELECT table1.id
FROM table1, table2
WHERE table1.id != table2.id
 
qq à une autre solution ?


Passer à MySql 4.1 ou à Postgres, ou Oracle...


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
n°334286
ZeBorG
Yes we can!
Posté le 16-03-2003 à 01:13:36  profilanswer
 

Mara's dad a écrit :


Passer à MySql 4.1 ou à Postgres, ou Oracle...

je suis malheureusement coincé avec mySQL 3.23.54
 
qq a une idée ?

n°334330
mrbebert
Posté le 16-03-2003 à 11:40:37  profilanswer
 

ZeBorG a écrit :

Je viens de me rendre compte de quelque chose : Cette solution marche pour des petites tables mais pour des tables à 50000+ entrées, bonjour les dégats !
 
C'est comme faire :
 
SELECT table1.id
FROM table1, table2
WHERE table1.id != table2.id
 
qq à une autre solution ?

Fais un "explain" de ta requête (c'est à dire, passe ta requête en mettant juste 'explain ' devant). Il t'indiquera comment il l'exécute, quels index il utilise et une estimation du nombre de lignes qu'il traitera.
Ensuite, essaie de modifier ta requête (LEFT JOIN au lieu de simples jointures, tables dans un ordre différent...) pour diminuer améliorer son exécution [:proy]

n°334410
ZeBorG
Yes we can!
Posté le 16-03-2003 à 14:04:39  profilanswer
 

a titre indicatif, quand est-ce que mySQL 4.x final sort ?

mood
Publicité
Posté le   profilanswer
 

 Page :   1  2  3
Page Suivante

Aller à :
Ajouter une réponse
 

Sujets relatifs
[SQL] Oracle : rafraichissement d'un snapshot[SQL] requête sql sur une base access...help me !!!
[SQL] Un doute sur une requête pour attribuer des droits ?[java][newbie]savoir si le txtfield est bien un int[résolu]
[SQL] un doute sur le "as" dans Access et pour le "SQL pur" ?Ouvrir une popup sur une page existante ou bien fermer la page existan
[SQL] blob et image binaireDes arguments pour expliquer que les normes, c'est bien ?
Plus de sujets relatifs à : SQL, : Je n'arrive pas à formuler la requète qui va bien...


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