2012-01-16 85 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