Page 1 sur 1

Subtilité SQL

Posté : 01 nov. 2005, 13:21
par kivan
Bonjour, j'aimerai qu'on m'explique une subtilité du SQL, ces deux requêtes semblent faire la même chose, et pourtant
il parait que la deuxième est "plus propre" que la première... Purquoi cela ?

$rq="SELECT DISTINCT D.id_date,C.id_concert FROM concert_date
D,concert C,concert_groupe G ORDER BY $tri LIMIT $deb,$fin";



$rq="SELECT DISTINCT D.id_date,C.id_concert FROM concert C
INNER JOIN concert_date D on (D.id_concert = C.id_concert)
INNER JOIN concert_groupe G on (G.id_concert = C.id_concert)
ORDER BY `$tri` LIMIT $deb,$fin";

merci d'avance,

Posté : 01 nov. 2005, 14:36
par albat
Je ne dirai pas que la seconde est "plus propre",
je dirais plutot que la première est une hérésie. ;)

Tu vas nous générer un magnifique produit cartésien.
Et c'est très mal. :evil:

Je ne crois pas que tes deux requêtes donnent le même résultat.

Posté : 01 nov. 2005, 15:01
par kivan
mince petite erreure, en faite la première requête était :

$rq="SELECT DISTINCT D.id_date,C.id_concert FROM concert_date
D,concert C,concert_groupe G WHERE D.id_concert=C.id_concert AND G.id_concert=C.concert ORDER BY $tri LIMIT $deb,$fin";


là y a-t-il une différence avec :

$rq="SELECT DISTINCT D.id_date,C.id_concert FROM concert C
INNER JOIN concert_date D on (D.id_concert = C.id_concert)
INNER JOIN concert_groupe G on (G.id_concert = C.id_concert)
ORDER BY `$tri` LIMIT $deb,$fin";

Posté : 01 nov. 2005, 15:24
par albat
N'oublie pas d'afficher ton code formaté grâce aux balises
 ou [code ], merci.
[php]$rq_01 = "SELECT DISTINCT D.id_date, C.id_concert
          FROM concert_date D, concert C, concert_groupe G
          WHERE D.id_concert = C.id_concert
            AND G.id_concert = C.concert
          ORDER BY $tri
          LIMIT $deb, $fin";

$rq_02 = "SELECT DISTINCT D.id_date, C.id_concert
          FROM concert C INNER JOIN concert_date D on (D.id_concert = C.id_concert)
                         INNER JOIN concert_groupe G on (G.id_concert = C.id_concert)
          ORDER BY $tri
          LIMIT $deb, $fin";
Les résultats de tes requêtes seront identiques.
Ces deux requêtes sont donc équivalentes.

Cependant, la 2e est effectivement plus "élégante"
car les jointures sont plus vite traitées que les clauses WHERE
(que l'on devrait n'utiliser que pour des tests de valeurs)

C'est donc une question d'optimisation.
Mais les différences de performances risquent fort d'être imperceptibles.

Tu as donc le choix entre ces deux écritures. ;)

Posté : 01 nov. 2005, 15:44
par kivan
oki merci ! :D

Posté : 01 nov. 2005, 16:25
par albat
Et le [Résolu] ? ;)