繁体   English   中英

如何在对最多行进行计数的同时联接SQL表?

[英]How to join a SQL table while doing a count for the most rows?

因此,我有一个“书签”表,我试图为该表获取具有最多书签内容的用户的“ 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 

现在,我尝试将结果查询加入“帐户”表,以通过将用户ID与帐户表中的“ 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表,而是返回与之前相同的结果。 我需要能够获取帐户表的所有行(与使用*相同)

如果有帮助,我的帐户表中的这些行=用户名,ID,电子邮件,而我的书签表中的这些行= ID,用户ID,链接

一种解决方案是将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允许您仅列出group by bookmark.UserID 尽管可以,但是不建议这样做。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM