2016-05-18 11 views
3

私は通知モーダルと、ユーザーが多くの通知を持ち、通知がユーザー間で送信されるユーザーモーダルを持っています。私は、各ユーザから最新の通知を取得し、それらをタイムスタンプでソートして返す関数が必要です。最新のものとは別のものと順番を選択します

私はBY SELECT ... DISTINCT ORDER使用してみました:、SELECT DISTINCT, ORDER BY expressions must appear in select list

created_at選択リストに表示されない:このSQLを生成

@notifications = Notification.select("DISTINCT(notifier_id, created_at)").order('created_at DESC') 

SELECT DISTINCT(notifier_id, created_at) FROM "notifications" ORDER BY "notifications"."created_at" DESC, created_at DESC)

を私はエラーを取得だから問題は何ですか?この記事に基づいて

PG::Error: SELECT DISTINCT, ORDER BY expressions must appear in select list

私はBY ... ORDER BY SELECT ... GROUPを使用してみました:

このSQLを生成
@notifications = Notification.select("notifier_id").group("notifier_id").order("MAX(created_at)") 

SELECT "notifications"."notifier_id" FROM "notifications" GROUP BY notifier_id ORDER BY "notifications"."created_at" DESC, MAX(created_at)

が、今、私はこれを取得エラー:column "notifications.created_at" must appear in the GROUP BY clause or be used in an aggregate function

私は集計関数を使用していますので、エラーは何ですか?

UPDATE:

は、このコードを使用する:

@notifications = Notification.select("DISTINCT ON (created_at) created_at, notifier_id").order('created_at DESC') 

私はすべてのメッセージのリストを取り戻すのではなく、各送信者からだけで最新の。 documentationから

@messages = Message.select("DISTINCT ON (created_at) created_at, sender_id").order('created_at DESC') 

+0

エラー出力は基本的に何を修正するかを指示します。あなたはそれをやってみましたか? –

+0

基本的な解決策を説明できますか? – Cbas

+0

2番目の 'GROUP BY'クエリはちょっと面倒です。あなたの希望する結果と一緒にいくつかのサンプルデータを投稿できますか?これはRubyの問題よりもPostgresの問題です。 –

答えて

1

はこれを試してみてください

The DISTINCT ON expression(s) must match the leftmost ORDER BY expression(s).

あなたは、エラーメッセージごとに2番目のクエリを手直しする必要があります。

+0

これはOkを実行しますが、メッセージを出力しようとすると、存在しない属性に関連するエラーが発生します。 selectとgroupの両方で取得したいすべての属性を含める必要がありますか?もしそうなら、私は検索する12の属性を持っている場合、これを書くためのよりきれいな方法がありますか? – Cbas

+0

@Cbas Postgresでは、あなたが選択した列を 'GROUP BY'節に含める必要がありますが、集約関数(例えば' SUM')の中には表示されないと_ _ _ _ _ _ _ _ _しません。あなたのエラーは、私の答えの制限ではなく、一般的なSQLの問題かもしれません。 –

+0

ありがとう、私はその問題を解決することができましたが、今はすべてのメッセージのリストを返すだけでなく、各送信者から最新のものです。同じユーザーから複数のメッセージを返さないようにする方法はありますか?私はコードをコピーして更新版 – Cbas

関連する問題