2012-12-08 38 views
25

Tôi thấy nhiều câu hỏi tương tự nhưng chúng phức tạp đến nỗi tôi không thể hiểu chúng, hoặc chúng dường như không hỏi cùng một điều.Sử dụng các kết quả từ truy vấn sql khác trong câu lệnh con (subquery?)

Thật đơn giản: Tôi có hai cột: người dùng (dmid) và tải xuống (dfid).

  1. Chọn tất cả người dùng tải về một tập tin cụ thể:

    SELECT DISTINCT dmid FROM downloads_downloads where dfid = "7024" 
    
  2. Sử dụng cho người sử dụng ở trên, tất cả các tập tin tất cả họ đều tải:

    SELECT dfid from downloads_downloads WHERE dmid = {user ids from #1 above} 
    
  3. Count và đặt hàng DFID kết quả, vì vậy, chúng tôi có thể xem số lượng tệp tải xuống mà mỗi tệp đã nhận được:

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

Nỗ lực của tôi khi trả lời.

Điều này có vẻ gần, nhưng MySql không hoạt động và không phản hồi ngay cả sau 30 giây - tôi khởi động lại Apache cuối cùng. Và tôi không phải bây giờ làm thế nào để cấu trúc số lượng và thứ tự mà không nhận được lỗi cú pháp vì câu lệnh phức tạp - và nó thậm chí có thể không phải là câu lệnh đúng.

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

Bạn không nên sử dụng Các dấu ngoặc kép là một điều MySQL và sẽ không làm việc với các DBMS khác (vì trong các dấu ngoặc kép SQL chuẩn được sử dụng cho các mã định danh, không phải cho các chữ cái) Và nếu dfid là giá trị số, bạn không nên sử dụng bất kỳ trích dẫn nào. Con số không cần dấu ngoặc kép. –

Trả lời

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

hoặc sử dụng một tự tham gia

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

nếu điều này mất nhiều thời gian thì có thể bạn sẽ cần phải đăng một giải thích kế hoạch (google nó!)

+4

cho tôi giải pháp # 1 hoạt động, và nó khá dễ hiểu, nhưng bạn có thể giải thích, tôi giải pháp # 2 tôi có thể đứng tự tham gia –

+0

@ paul-creasey Tôi biết điều này là cũ, nhưng bạn có thể giải thích mã thứ hai? – Rafael

Các vấn đề liên quan