Subtilité SQL

Eléphanteau du PHP | 15 Messages

01 nov. 2005, 13:21

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,

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

01 nov. 2005, 14:36

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.

Eléphanteau du PHP | 15 Messages

01 nov. 2005, 15:01

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

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

01 nov. 2005, 15:24

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

Eléphanteau du PHP | 15 Messages

01 nov. 2005, 15:44

oki merci ! :D

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

01 nov. 2005, 16:25

Et le [Résolu] ? ;)