使用SQL JOIN和COUNT

时间:2013-06-03 14:49:05

标签: php mysql sql join

让两个表,一个持有用户信息,另一个持有某种用户记录,比如收据。用户和收据之间存在一对多的关系。

检索用户的最佳SQL方法是什么,按最大收据数排序?

我能想到的最好方法是使用连接和计数(?)来返回一组用户及其相关收据的数量。

有没有办法在这个实例中使用count函数?

select * from `users` inner join `receipts` on `users`.`id` = `receipts`.`uId`

5 个答案:

答案 0 :(得分:5)

如果OP希望利用users表中的数据包含其他信息(其他聚合等......):

SELECT `users`.`id`,
       count(`receipts`.`uId`)
FROM `users`
INNER JOIN `receipts` ON `users`.`id` = `receipts`.`uId`
GROUP BY `users`.`id`
ORDER BY count(`receipts`.`uId`) DESC

否则,只需要receipts表...

SELECT `users`.`id`,
       count(`receipts`.`uId`)
FROM `receipts`
GROUP BY `receipts`.`uId`
ORDER BY count(`receipts`.`uId`) DESC

答案 1 :(得分:3)

试试这个

SELECT a.`id`, count(b.`recipts`) as total_receipts
FROM `users` a
INNER JOIN `receipts` b
ON a.`id` = b.`uId`
GROUP BY a.`id` 
ORDER BY count(b.`receipts`) desc

答案 2 :(得分:2)

SELECT users.*, (SELECT COUNT(*) FROM tblreceipts WHERE tblreciepts.uId=users.id) as counter FROM {用户{1}}

这样的事情可能有用(虽然它的大表不确定速度)

答案 3 :(得分:2)

如果您想要包含所有用户,即使是那些没有收据的用户,那么一个好方法就是left outer join

SELECT u.*, count(r.uid) as NumReceipts
FROM `users` u left outer join
     `receipts` r
    ON u.id = r.`uId
GROUP BY `u.id
ORDER BY NumReceipts DESC;

如果您只想拥有收据的用户的ID,则甚至不需要加入:

SELECT r.uid, count(*) as NumReceipts
FROM receipts r
GROUP BY r.uid
ORDER BY NumReceipts

答案 4 :(得分:2)

Dave和meewoK提供的两个答案将满足您的需求。我提供了一个替代方案,提供更好的性能,并允许您显示更多用户信息,因为在Dave的答案中,您只能选择聚合函数或组中使用的列子句。

SELECT users.id, users.name, r.numReceipts  
FROM users u
INNER JOIN (
   SELECT uId, count(receipts) as numReceipts
   FROM receipts
   GROUP BY receipts.id
) as r ON r.uId = u.id
ORDER BY r.numReceipts DESC

这会创建一个内联视图。仅返回每个用户的收据计数,然后将此内联视图加入用户的ID。

如果我错了,有人会纠正我,但是我被告知当你在SELECT子句中执行标量子查询时,规划器效率不高。最好以这种方式加入临时表。有多种方法可以编写此查询,这一切都取决于您希望如何使用这些信息!干杯!