日付順のSQLクエリから1列を選択するにはどうすればよいですか?

ですから、 sender_idrecipient_idcontentcreated_at という列を持つプライベートメッセージモデルがあります。

私は私が伝えた最後の5人の受取人を選びたいと思う。しかし、私はどのように列を絞り込むかを理解することはできません。

私の現在の質問はこれです:

SELECT DISTINCT recipient_id, created_at FROM private_messages WHERE sender_id = :user_id ORDER BY created_at DESC LIMIT 5

ORDER BY のためにcreated_at列を取り除くことはできません。私は何かが欠けているに違いないが、それが何であるか完全にはわからない。

0
私は、サブクエリを使ってそれを行う本当にハッキーな代替方法を考え出しました。不思議なことに、これは私がしたものです:SELECT DISTINCT recipient_id FROM(SELECT recipient_id FROM private_messages where sender_id =:user_id ORDER BY created_at DESC)AS受信者LIMIT 5
追加された 著者 Dasun,

6 答え

私はORDER BYに必要なので、created_atカラムを取り除くことはできません。

いいえ。

Order By cluaseの列は、SELECT列のリストに存在する必要はありません。 クエリのSELECTリストで created_at 列を省略することができます。残りのクエリはうまく動作します。

上記の事実が示されている SQL FIDDLE を確認してください。

2
追加された
質問に記載されているように、あなたの要件には、distinctは必須ではありません...
追加された 著者 Mudassir Hasan,
わかりました。
追加された 著者 Mudassir Hasan,
申し訳ありませんが、私はあなたより良い解決策を考えることができません..
追加された 著者 Mudassir Hasan,
奇妙な、私はDISTINCTとcreated_atを取り出し、それはうまく動作します。しかし、DISTINCTを追加すると、次のエラーが表示されます。PG :: Error:ERROR:SELECT DISTINCT、ORDER BY式が選択リストに表示されている必要があります。
追加された 著者 Dasun,
それが正しければ、私は同じユーザーに5回メッセージを送ることができました。それがなければ、私はそのrecipient_idを5回取得します。
追加された 著者 Dasun,

これを試して

 WITH t AS ( SELECT max(created_at) AS created_at, recipient_id  FROM messages 
 GROUP BY recipient_id  )

 SELECT created_at, recipient_id   FROM t ORDER BY created_at DESC LIMIT 5  
0
追加された

列を省略することはできません。これはしばらく前にSQL標準に追加されました。

SELECT DISTINCTの場合、ORDER BY式は選択リストに表示する必要があります。

ここ(Tom Laneのメッセージ)から引用

実際にはその定義上の理由があります。検討する

     

SELECT DISTINCT x FROMタブORDER BY y;

     

表内の特定のx値には、   値。出力でそのx値をソートするのにどちらを使いますか?

     

SQL92に戻って、彼らはこの問題を避けるために、ORDER BY
  エントリは出力列を参照する必要がありました。 SQL99にはちょっとした言葉遣いがあります   私の制限と同じ場所に出てくると思います。

たとえば、Oracleではこのルール(10gまたは11g)は適用されません。

0
追加された

あなたは以下のようなものを試しましたか?

SELECT TOP 5  recipient_id
FROM private_messages 
WHERE sender_id = :user_id 
GROUP BY recipient_id
ORDER BY created_at DESC

私はあなたがorder by節でそれを使うためにあなたの選択においてcreated_atを必要としないと信じています。これは、使用しているデータベースシステムによって異なりますが、SQLサーバーではこれを許可します。

0
追加された
PostGreSQLでトップ5を削除し、最後にリミット5を追加します。
追加された 著者 JanR,
私はPostGreSQLを使用しています..構文エラー:PG ::エラー:エラー:または "5"
追加された 著者 Dasun,
他の応答と同じエラー:列 "private_messages.created_at"はGROUP BY句に現れなければならないか、集約関数で使用する必要があります
追加された 著者 Dasun,

これを試してみてください:SELECT DISTINCT recipient_id、created_at FROM private_messagesどこsender_id =:user_id GROUP BY recipient_id ORDER BY created_at DESC LIMIT 5

0
追加された
distinctとgroup byはこの状況で同じことを行い、あなたがグループを作成した場合、あなたの例ではidとdateでグループ化する必要があります
追加された 著者 JanR,
私はこのエラーが発生します:列 "private_messages.created_at"は、GROUP BY句に表示するか、集約関数で使用する必要があります
追加された 著者 Dasun,
group by句が使用されているのでdistinctを削除してみてください
追加された 著者 passion,

試してください: SELECT recipient_id FROM(SELECT recipient_id、MAX(created_at)created_atからprivate_messagesどこsender_id =:user_id GROUP BY recipient_id)ORDER BY created_at DESC LIMIT 5;

0
追加された