如何在对大多数行进行计数时加入SQL表?

时间:2011-07-29 20:39:56

标签: php mysql sql

所以我有一个“书签”表,我试图获得具有最多内容书签的用户的“UserID”。此查询返回十个最活跃用户的UserID。这个查询对我来说是这样的并且有效:

SELECT COUNT(*) AS `Rows`, UserID FROM `bookmark`
WHERE UserID NOT IN(1, 2, 25, 38, 41, 43, 47, 125) 
GROUP BY UserID ORDER BY `Rows` DESC LIMIT 10 

现在我尝试将结果查询加入“accounts”表,通过将UserID与accounts表中的“id”进行比较来获取每个用户ID的所有信息。

SELECT COUNT(*) AS `Rows`, UserID FROM `bookmark`
join accounts ON accounts.ID = bookmark.UserID
WHERE UserID NOT IN(1, 2, 25, 38, 41, 43, 47, 125) 
GROUP BY UserID ORDER BY `Rows` DESC LIMIT 10 

这不会将任何行作为accounts表返回,而是返回与之前相同的结果。我需要能够获取帐户表的所有行(与使用*相同)

如果它有助于我的帐户表有这些行= user_name,id,email和我的书签表有这些rows = id,UserId,link

2 个答案:

答案 0 :(得分:1)

一种解决方案是将group by移动到子查询:

select  *
from    (
        select  count(*) as Rows
        ,       UserID 
        from    bookmark
        where   UserID not in (1, 2, 25, 38, 41, 43, 47, 125) 
        group by
                UserID 
        ) as BookmarkSubquery
join    accounts
on      accounts.ID = BookmarkSubquery.UserID
order by
        BookmarkSubquery.Rows DESC 
limit   10 

另一种方法是通过以下方式将帐户中的列添加到组中:

select  count(*) as Rows
,       bookmark.UserID 
,       accounts.Name
,       accounts.BirthDate
from    bookmark
join    accounts
on      accounts.ID = BookmarkSubquery.UserID
where   bookmark.UserID not in (1, 2, 25, 38, 41, 43, 47, 125) 
group by
,       bookmark.UserID 
,       accounts.Name
,       accounts.BirthDate
order by
        count(*) DESC 
limit   10 

注意:MySQL允许您仅列出bookmark.UserID中的group by;虽然这样可行,但不建议这样做。

答案 1 :(得分:0)

这可能很丑,但您可以将第一个查询存储在临时表中,然后在帐户和临时表之间进行连接。

另外,尝试进行左连接以查看是否有任何方式。有时这有助于调试查询。