假设有两张表,一张保存用户信息,一张保存某种用户记录,比如收据。用户和收据之间存在一对多的关系。
检索用户的最佳 SQL 方法是什么,按最大收据数排序?
我能想到的最好方法是使用 join 和 count(?) 返回一组用户及其相关收据的数量。
有没有办法在这种情况下使用计数功能?
select * from `users` inner join `receipts` on `users`.`id` = `receipts`.`uId`
如果 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
试试这个
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
Dave 和 meewoK 提供的两个答案将满足您的需求。我提供了一种替代方法,它应该提供更好的性能并允许您显示更多用户信息,因为在 Dave 的回答中,您只能选择聚合函数或 group 子句中使用的列。
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 子句中执行标量子查询时,规划器效率不高。最好以这种方式加入临时表。有多种方法可以编写此查询,这完全取决于您要如何使用这些信息!!!干杯!
SELECT users.*, (SELECT COUNT(*) FROM tblreceipts WHERE tblreciepts.uId=users.id) as counter FROM
用户ORDER BY counter DESC
像这样的东西可能会起作用(虽然如果它的大桌子不确定速度)
如果您想包括所有用户,即使是那些没有收据的用户,那么一个好方法是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