web-dev-qa-db-fra.com

Utiliser les résultats d'une requête SQL dans une autre instruction where (sous-requête?)

Je vois beaucoup de questions similaires, mais elles sont si complexes que je ne peux pas les comprendre ou elles ne semblent pas demander la même chose.

C'est simple: j'ai deux colonnes: utilisateurs (dmid) et téléchargements (dfid).

  1. Sélectionnez tous les utilisateurs qui ont téléchargé un fichier spécifique:

    SELECT DISTINCT dmid FROM downloads_downloads where dfid = "7024"
    
  2. En utilisant les utilisateurs ci-dessus, trouvez tous les fichiers qu'ils ont tous téléchargés:

    SELECT dfid from downloads_downloads WHERE dmid = {user ids from #1 above}
    
  3. Comptez et ordonnez les résultats dfid, afin que nous puissions voir combien de téléchargements chaque fichier a reçu:

    dfid    dl_count_field
    ----    --------------
    18       103
    3        77
    903      66
    

Ma tentative de réponse.

Cela semble proche, mais MySql s'embourbe et ne répond pas même après 30 secondes - je redémarre finalement Apache. Et je ne sais pas maintenant comment structurer le nombre et l'ordre sans obtenir des erreurs de syntaxe à cause de l'instruction complexe - et ce n'est peut-être même pas la bonne instruction.

SELECT dfid from downloads_downloads WHERE dmid IN (
    SELECT DISTINCT dmid FROM `downloads_downloads` where dfid = "7024")
34
Josh Bond
SELECT dfid,count(*) 
from downloads_downloads 
WHERE dmid IN (
    SELECT dmid 
    FROM downloads_downloads 
    where dfid = "7024"
)
group by dfid

ou en utilisant une auto-jointure

select t1.dfid,count(*)
from downloads_downloads t1
inner join downloads_downloads t2
on t1.dmid = t2.dmid
where t2.dfid = "7024"

si cela prend trop de temps, vous devrez probablement publier un plan d'explication (google it!)

42
Paul Creasey