2012-01-16 105 views
0

我有一個表,其中包括所有用戶的視頻下載歷史:合併兩個查詢在MySQL

src_ip vlan_id video_id area date_pl 
aaaa  A  1  123 xxxx-xx-xx 
aaaa  A  2  123 xxxx-xx-xx 
aaaa  B  1  456 xxxx-xx-xx 
bbbb  A  4  123 xxxx-xx-xx 
bbbb  C  6  567 xxxx-xx-xx 
... 

我用src_ip和VLAN_ID的組合來識別不同的用戶,現在我要隨機選擇50個不同的用戶(這意味着50個不同的src_ip和vlan_id組合)並列出所有的下載歷史記錄。

所以首先我所做的:

SELECT distinct src_ip, vlan_id from video_2 as table2 
    WHERE date_pl >= '2011-11-29 00:00' AND date_pl <= '2011-12-05 23:55' order by rand() limit 50 

然後我做:

SELECT src_ip, vlan_id, video_id, area from video_2 
    where video_2.src_ip = table2.src_ip AND video_2.vlan_id = table2.vlan_id 
    AND date_pl >= '2011-11-29 00:00' AND date_pl <= '2011-12-05 23:55' 

但問題是,因爲它們是兩個獨立的查詢,在第二個查詢,不知道是什麼table2是。

我該如何解決這個問題或如何將這兩個查詢合併爲一個?

回答

2
CREATE TEMPORARY TABLE table2 
AS 
SELECT distinct src_ip, vlan_id from video_2 
WHERE date_pl >= '2011-11-29 00:00' AND date_pl <= '2011-12-05 23:55' 
ORDER BY rand() 
LIMIT 50; 

SELECT src_ip, vlan_id, video_id, area 
FROM 
    video_2 
    JOIN 
    table2 ON video_2.src_ip = table2.src_ip AND video_2.vlan_id = table2.vlan_id'; 

可以 不能 使「表2」中,因爲在子查詢中使用LIMIT限制 系。否則,它會是

SELECT 
    v2.src_ip, v2.vlan_id, v2.video_id, v2.area 
FROM 
    video_2 v2 
    JOIN 
    (SELECT distinct v.src_ip, v.vlan_id from video_2 v 
    WHERE v.date_pl >= '2011-11-29 00:00' AND v.date_pl <= '2011-12-05 23:55' 
    ORDER BY rand() 
    LIMIT 50 
    ) table2 ON v2.src_ip = table2.src_ip AND v2.vlan_id = table2.vlan_id; 

編輯:子查詢的限制限制適用於大部分,而不是派生表

編輯2:添加多個別名

+0

第二個查詢在MySQL工作正常。 'IN/ALL/ANY/SOME'子查詢中不允許使用「LIMIT」。它可以用作您的示例的派生表中。 – 2012-01-16 13:32:22

+0

@ypercube:啊,我在IN中看到它:http://dev.mysql.com/doc/refman/5.5/en/subquery-errors.html – gbn 2012-01-16 13:34:58

+0

@gbn感謝您的回覆。我使用了第二個查詢,但在這裏我得到了另一個錯誤:字段列表中的src_ip'不明確。你有任何建議來解決這個問題嗎? – manxing 2012-01-16 13:37:16