7

2 つのテーブルがあります。1 つ (P) には製品のリストが含まれ、もう 1 つ (H) には消費された製品の履歴が含まれます。すべての製品は 0 回以上消費できます。P からのすべての製品と、各製品が消費された回数を、消費された回数で並べ替えて返すクエリを作成する必要があります。これが私がしたことです:

SELECT P.ID, P.Name, H.Date, COUNT(H.P_ID) as Count 
FROM P 
LEFT JOIN H 
  ON P.ID=H.P_ID  
ORDER BY Count DESC

これは、履歴テーブルにデータが含まれている場合にのみ機能するようですが、含まれていない場合、結果は正しくありません。私は何を間違っていますか?

4

1 に答える 1

15

必要なgroup byカウントを取得するには が必要です。また、集計関数を に適用する必要がありますH.Date。そうしないと、選択する日付が明確になりません。

SELECT P.ID, P.Name, COUNT(H.P_ID) as Count, MAX(H.Date) as LastDate
FROM P 
LEFT JOIN H ON P.ID=H.P_ID
GROUP BY P.ID, P.Name
ORDER BY Count DESC

MAX(H.Date)最後に消費した日付を表示することにしました。とは異なる日付が必要な場合はH、集計関数を変更してください。

sqlite でエイリアスでソートできるかどうかはわかりません。そうでない場合は、交換してください

ORDER BY Count DESC

ORDER BY COUNT(H.P_ID) DESC
于 2013-05-01T19:09:48.637 に答える