par
Hubert Roksor » 06 juin 2007, 16:21
Just un mot pour dire que l'utilisation de jointures sous forme de virgules rend la lecture des requêtes très difficiles car elle pousse les conditions de jointure dans la clause WHERE. Si tu réécris ta requête pour utiliser "JOIN" (synonyme de "INNER JOIN", synonyme des virgules) tout devient plus clair
Code : Tout sélectionner
SELECT a.id, a.Nom, a.Cover, a.Date, g.Groupe, u.username, v.vote as thisvote, p.vote as thatvote
FROM user_votes v
JOIN user_votes p ON p.user_id = v.user_id
AND p.alb_id <> v.alb_id
AND p.vote IN (5, 6, 7)
JOIN albums a ON a.id = p.alb_id
JOIN rela_groupe_album r ON r.album_id = a.id
JOIN groupes g ON g.id = r.groupe_id
JOIN phpbb_users u ON u.user_id = v.user_id
WHERE v.alb_id = '$ALB_ID'
AND v.vote IN (5, 6, 7)
GROUP BY p.alb_id
ORDER BY RAND()
LIMIT 5
Pour le reste... c'est un problème compliqué donc très difficile à dire sans connaitre les données de la base. Exécute un EXPLAIN de ta requête et publie le résultat, ça peut aider.
Je vois que les données des tables a, r, g et u n'influe pas sur les résultats de la requête, donc tu devrais pouvoir faire le plus gros de la requête sous la forme d'une table dérivée (v,p) et joindre le résultat aux tables auxilliaires. De plus, vérifie que tu possèdes un index (probablement UNIQUE, d'ailleurs) sur (user_id, alb_id) ainsi que sur (alb_id) ou peut-être même sur (alb_id, vote) selon la répartition des votes (utile s'il y a une faible proportion de 5, 6 et 7, sinon oublie).
À part ça, j'ai un peu de mal à m'imaginer ce que tu cherches à faire (pour dire la vérité je ne suis pas super motivé non plus, essaie de le formuler sous la forme d'une requête si tu veux attirer mon attention

), est-ce que la requête ci-dessus fait ce que tu veux obtenir ? Sinon, en quoi diffère-t'elle de ce que tu souhaites obtenir ? (en termes fonctionnels si possible, merci)
Just un mot pour dire que l'utilisation de jointures sous forme de virgules rend la lecture des requêtes très difficiles car elle pousse les conditions de jointure dans la clause WHERE. Si tu réécris ta requête pour utiliser "JOIN" (synonyme de "INNER JOIN", synonyme des virgules) tout devient plus clair
[code]SELECT a.id, a.Nom, a.Cover, a.Date, g.Groupe, u.username, v.vote as thisvote, p.vote as thatvote
FROM user_votes v
JOIN user_votes p ON p.user_id = v.user_id
AND p.alb_id <> v.alb_id
AND p.vote IN (5, 6, 7)
JOIN albums a ON a.id = p.alb_id
JOIN rela_groupe_album r ON r.album_id = a.id
JOIN groupes g ON g.id = r.groupe_id
JOIN phpbb_users u ON u.user_id = v.user_id
WHERE v.alb_id = '$ALB_ID'
AND v.vote IN (5, 6, 7)
GROUP BY p.alb_id
ORDER BY RAND()
LIMIT 5[/code]
Pour le reste... c'est un problème compliqué donc très difficile à dire sans connaitre les données de la base. Exécute un EXPLAIN de ta requête et publie le résultat, ça peut aider.
Je vois que les données des tables a, r, g et u n'influe pas sur les résultats de la requête, donc tu devrais pouvoir faire le plus gros de la requête sous la forme d'une table dérivée (v,p) et joindre le résultat aux tables auxilliaires. De plus, vérifie que tu possèdes un index (probablement UNIQUE, d'ailleurs) sur (user_id, alb_id) ainsi que sur (alb_id) ou peut-être même sur (alb_id, vote) selon la répartition des votes (utile s'il y a une faible proportion de 5, 6 et 7, sinon oublie).
À part ça, j'ai un peu de mal à m'imaginer ce que tu cherches à faire (pour dire la vérité je ne suis pas super motivé non plus, essaie de le formuler sous la forme d'une requête si tu veux attirer mon attention :lol:), est-ce que la requête ci-dessus fait ce que tu veux obtenir ? Sinon, en quoi diffère-t'elle de ce que tu souhaites obtenir ? (en termes fonctionnels si possible, merci)