3 votes

Combinaison de 2 requêtes en 1

Je cherche à optimiser deux requêtes en une seule, si possible.

Ma première requête recherche tous les auteurs d'une chanson... Ensuite, pour chaque auteur trouvé, je veux trouver le nombre total de chansons auxquelles l'auteur a participé...

Actuellement, j'exécute la première requête et pour chaque ligne trouvée, je lance une autre requête pour obtenir le nombre total de chansons auxquelles l'auteur a participé... Donc, s'il y a 4 auteurs, je finirai par lancer 4 requêtes supplémentaires... C'est trop de requêtes à mon avis. C'est pourquoi j'ai décidé de poster ici, pour obtenir de l'aide sur la manière d'optimiser ma requête...

Voici la requête que j'exécute pour obtenir l'auteur(s) responsable d'une chanson :

$sql = "SELECT author.author_id, author.name
    FROM track INNER JOIN lyrics_author ON track.lyrics_id = lyrics_author.lyrics_id
    INNER JOIN author ON lyrics_author.author_id = author.author_id
    WHERE track.track_id = $trackid ";

Voici la requête pour obtenir le nombre total de chansons écrites par l'auteur :

$total = "SELECT lyrics_author.author_id, count(*) as total
    FROM lyrics_author
    WHERE lyrics_author.author_id = $author_id
    GROUP BY lyrics_author.author_id";

Voici un exemple du code :

query($sql);

while ($row_author = $result_author->fetch_assoc()) {
    $author_id = $row_author['author_id'];

    $total = "SELECT lyrics_author.author_id, count(*) as total
        FROM lyrics_author
        WHERE lyrics_author.author_id = $author_id
        GROUP BY lyrics_author.author_id";

    $result_total_lyrics = @ $conn->query($total);
    $t = $result_total_lyrics->fetch_assoc();

    echo $t['total'];

    $result_total_lyrics->free();
}

$result_author->free();
?>

Est-il possible d'optimiser cette requête? Si oui, comment? Y a-t-il un lien que vous pourriez me recommander, pour que je puisse apprendre...

Merci Marco

1voto

Puggan Se Points 4831
SÉLECTIONNER
  author.author_id,
  author.name,
  COUNT(DISTINCT more_tracks.lyrics_id) COMME total
DE track
JOIN lyrics_author UTILISATION (lyrics_id)
JOIN author UTILISATION (author_id)
GAUCHE JOIN lyrics_author COMME more_tracks UTILISATION (author_id)
OÙ track.track_id = $trackid
GROUPE PAR author.author_id

1voto

Tony Hopkinson Points 15160

C'est confus au possible. Pourquoi passez-vous un trackid en tant que lyricsid alors que vous avez une propriété appelée lyricsid ?? Quoi qu'il en soit

Sélectionnez auteur.auteur_id, auteur.nom, Compter(*)
inner join
(SELECT lyrics_author.auteur_id 
FROM lyrics_author 
INNER JOIN pistes ON piste.lyrics_id = lyrics_author.lyrics_id 
WHERE piste.track_id = $lyricsid ";
)  as auteurs_littéraires
inner join lyrics_author on lyrics_author.auteur_id = auteurs_littéraires.auteur_id
Sur auteur.auteur_id = auteurs_littéraires.auteur_id
Groupe par auteur.auteur_id, auteur.nom

Je pense ...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X