2012-12-08 11 views
25

Vedo molte domande simili ma sono così complesse che non riesco a capirle, o non sembrano chiedere la stessa cosa.Utilizza i risultati di una query sql in un'altra istruzione where (subquery?)

È semplice: ho due colonne: utenti (dmid) e download (dfid).

  1. Selezionare tutti gli utenti che hanno scaricato un file specifico:

    SELECT DISTINCT dmid FROM downloads_downloads where dfid = "7024" 
    
  2. Utilizzando gli utenti di cui sopra, trovare tutti i file che tutti scaricato:

    SELECT dfid from downloads_downloads WHERE dmid = {user ids from #1 above} 
    
  3. contare e ordinare il DFID risultati, quindi possiamo vedere quanti download hanno ricevuto ogni file:

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

Il mio tentativo di risposta.

Questo sembra vicino, ma MySql si blocca e non risponde nemmeno dopo 30 secondi - Riavvio Apache alla fine. E ora non so come strutturare il conteggio e ordinare da parte senza ottenere errori di sintassi a causa della dichiarazione complessa - e potrebbe anche non essere la giusta affermazione.

SELECT dfid from downloads_downloads WHERE dmid IN (
    SELECT DISTINCT dmid FROM `downloads_downloads` where dfid = "7024") 
+3

Non si deve usare virgolette doppie ('" ') per caratteri letterali, usa invece le virgolette singole.Le virgolette doppie sono una cosa MySQL e non funzioneranno con altri DBMS (perché nelle virgolette doppie standard SQL vengono utilizzate per gli identificatori, non per i letterali). che dfid è un valore numerico, tu non dovrebbe usare tutte le virgolette tutte. I numeri non hanno bisogno di virgolette. –

risposta

33
SELECT dfid,count(*) 
from downloads_downloads 
WHERE dmid IN (
    SELECT dmid 
    FROM downloads_downloads 
    where dfid = "7024" 
) 
group by dfid 

o utilizzando un self join

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

se questo richiede troppo tempo, allora si avrà probabilmente bisogno di pubblicare un piano di spiegare (google!)

+4

per me la soluzione n. 1 funziona, ed è abbastanza facilmente comprensibile, ma puoi spiegarmi per favore, io soluzione n. 2 posso stare in piedi per unirmi a –

+0

@ paul-creasey so che questo è vecchio, ma puoi spiegare il secondo codice? – Rafael

Problemi correlati