2012-09-12 62 views
2

我有这样一个架构和查询: http://sqlfiddle.com/#!2/7b032/3MySQL查询加入或子查询

Seperately我有这些疑问:

SELECT COUNT(*) AS 'times', userid, name 
FROM main 
WHERE comedate <= DATE_SUB(CURDATE(), 
        INTERVAL 5 DAY) 
GROUP BY userid ORDER BY times DESC LIMIT 0,2; 

SELECT * FROM details WHERE 1; 

通过比较两个表中的用户ID列,我需要加入他们的行列。
我需要一个输出具有这些列:
times, userid, name, age, location
也应考虑顺序,组和限制。

如果您可以使用JOIN和带有子查询的查询编写一个查询,我会很高兴。
我有一张60k桌子,我会比较表演。

+0

没有必要比较性能,加入胜。如果连接不成功,请添加一个索引。 – invertedSpear

+0

在单独的论坛我读过子查询更好,如果你有大表,连接更好的小表。我的桌子里面有60k行。所以我很好奇 – trante

回答

1

如何:

select x.times, 
    x.userid, 
    x.name, 
    d.age, 
    d.location 
from 
(
    SELECT COUNT(*) AS 'times', userid, name 
    FROM main 
    WHERE comedate <= DATE_SUB(CURDATE(), 
        INTERVAL 5 DAY) 
    GROUP BY userid 
) x 
left join details d 
    on x.userid = d.userid 

看到SQL Fiddle with Demo

编辑:

select x.times, 
    x.userid, 
    x.name, 
    d.age, 
    d.location 
from 
(
    SELECT COUNT(*) AS 'times', userid, name 
    FROM main 
    WHERE comedate <= DATE_SUB(CURDATE(), 
        INTERVAL 5 DAY) 
    GROUP BY userid 
    ORDER BY times DESC 
    LIMIT 0,2 
) x 
left join details d 
    on x.userid = d.userid 

看到SQL Fiddle with demo

+0

ORDER BY次列和添加LIMIT? – trante

+0

@trante刚刚在我的第二个版本中发现错误,请参阅我的编辑 – Taryn

+0

感谢您的帮助。是否可以使用子查询风格编写它,或者对于这种情况是不可能的? – trante