3

2 つのテーブルがあり、1 つはユーザー情報を保持し、もう 1 つはある種のユーザー レコード (レシートなど) を保持します。ユーザーと領収書の間には 1 対多の関係があります。

領収書の最大数でソートされた、ユーザーを取得するための最良の SQL メソッドは何ですか?

私が考える最良の方法は、結合とカウント(?) を使用して、ユーザーの配列と関連する領収書の数を返すことです。

このインスタンスで count 関数を利用する方法はありますか?

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

5 に答える 5

6

usersOPがテーブルのデータを利用して追加情報(追加の集計など)を含めたい場合:

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 が提供する 2 つの回答で、必要なことが達成されます。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 句でスカラー サブクエリを実行する場合、プランナーはそれほど効率的ではないと言われました。この方法で一時テーブルに参加することをお勧めします。このクエリを記述する方法は複数あり、情報をどのように使用するかによって異なります!!! 乾杯!

于 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 に答える