3

假设有两张表,一张保存用户信息,一张保存某种用户记录,比如收据。用户和收据之间存在一对多的关系。

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

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

有没有办法在这种情况下使用计数功能?

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

5 回答 5

6

如果 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
于 2013-06-03T14:52:16.960 回答
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
于 2013-06-03T14:52:49.597 回答
3

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 子句中执行标量子查询时,规划器效率不高。最好以这种方式加入临时表。有多种方法可以编写此查询,这完全取决于您要如何使用这些信息!!!干杯!

于 2013-06-03T15:16:16.290 回答
2

SELECT users.*, (SELECT COUNT(*) FROM tblreceipts WHERE tblreciepts.uId=users.id) as counter FROM用户ORDER BY counter DESC

像这样的东西可能会起作用(虽然如果它的大桌子不确定速度)

于 2013-06-03T14:53:38.287 回答
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
于 2013-06-03T15:01:18.063 回答