0

私はobjectsテーブルとvotesテーブルを持っています。私は現在、それらをグループ化し、最新の投票で並べ替えています。

SELECT objects.id, objects.name, MAX(votes.created_at) AS mv 
       FROM "objects"
       INNER JOIN "votes" ON "votes"."object_id" = "objects"."id" 
       GROUP BY objects.id, objects.name 
       ORDER BY mv DESC

ただし、これは投票権を持つオブジェクトのみを返します。SOを検索して、存在しない結果を含める方法に関する回答を見つけましたが、存在する結果と存在しない結果の両方を含めることを検討しています。

上記の投票権を持たないすべてのオブジェクトの最後に取り組む方法はありますか?

4

3 に答える 3

1

INNER JOIN基本的に、両方のテーブルにレコードが存在する結果を返します。LEFT JOIN次に、右側のテーブルに一致するレコードがあるかどうかに関係なく、左からすべての行を返すため、を使用する必要があります。

   SELECT objects.id, objects.name, MAX(votes.created_at) AS mv 
   FROM "objects"
          LEFT JOIN "votes" ON "votes"."object_id" = "objects"."id" 
   GROUP BY objects.id, objects.name 
   ORDER BY mv DESC

JOINの視覚的表現

お役に立てれば。ここに画像の説明を入力してください

于 2012-09-10T22:39:07.863 に答える
1

を使用すると、一致する行が見つからない場所LEFT JOINに値が入力されます-あなたが自分で見つけたようにNULL

投票のないすべてのエントリが最初にあることを除いて、それは完全に機能するため、非常にイライラします!

現在、NULL通常は最後にソートされます。しかし、それとは逆になりDESCます。Postgresでは、(バージョン8.3以降)最後まで明示的にソートするために使用できます。NULLS LASTNULL


SELECT o.id, o.name, max(v.created_at) AS lastest_vote
FROM   objects o
LEFT   JOIN votes v ON v.object_id = o.id 
GROUP  BY o.id, o.name
ORDER  BY lastest_vote DESC NULLS LAST, o.name; -- name only as tiebreaker

が主キーの場合、 (Postgres 9.1以降で)objects.id簡略化できます。GROUP BY

GROUP  BY o.id -- primary key covers all columns of this table
于 2012-09-11T03:03:58.843 に答える
0

ステートメントで使用する"LEFT OUTER JOIN"代わりに使用します。"INNER JOIN"

乾杯

于 2012-09-10T22:40:36.453 に答える