让两个表,一个持有用户信息,另一个持有某种用户记录,比如收据。用户和收据之间存在一对多的关系。
检索用户的最佳SQL方法是什么,按最大收据数排序?
我能想到的最好方法是使用连接和计数(?)来返回一组用户及其相关收据的数量。
有没有办法在这个实例中使用count函数?
select * from `users` inner join `receipts` on `users`.`id` = `receipts`.`uId`
答案 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子句中执行标量子查询时,规划器效率不高。最好以这种方式加入临时表。有多种方法可以编写此查询,这一切都取决于您希望如何使用这些信息!干杯!