私はこれを処理しようとしてきましたが、運がなかったので、誰かが私を助けてくれるとうれしいです.
私は2つのテーブルを持っています。アイテムとアイテム フラグ。
アイテム
id name levelid containertypeid roomid userid timestamp
-- ---- ------- --------------- ------ ------ -----
1 Item 1 0 0 3 5 1365072108
2 Item 2 0 0 3 5 1365342108
3 Item 3 0 0 3 5 1389072108
4 Item 4 0 0 3 5 1365085108
5 Item 5 2 3 3 5 1365962108
6 Item 6 1 3 3 5 1365322108
アイテム_フラグ
id itemid flagid userid timestamp
-- ---- ------- ------- ---------
1 1 1 5 1365072108
2 1 5 5 1365342108
3 1 2 5 1389072108
4 1 3 5 1365085108
5 2 4 5 1365762108
6 2 1 5 1365921087
7 2 3 5 1365252108
8 3 6 5 1365982108
9 3 7 5 1365312108
10 3 8 5 1365342108
目標
私がやろうとしているのは、降順のタイムスタンプでソートされたすべてのアイテムのリストを取得することです。したがって、事実上、実際のアイテムを更新したとき、またはアイテムにフラグを追加したときの最新のタイムスタンプに基づくアイテムのリストが必要です。特定のアイテムに対してフラグが追加されるたび、またはアイテム名またはレベルが更新されるたびに、アプリケーションはタイムスタンプを更新します。問題は、name、levelid などのフィールドを取得したい場合に GROUP BY を実行できないことです。集計関数でそれらを使用しているため、実際の値は返されません。それらをグループ化しない場合、フラグの数に応じて、各アイテムに対して明らかに複数の結果が得られます。これが私のクエリです:
SELECT
items.id,
items.name,
items.levelid,
items.containertypeid,
items.roomid,
items.userid
FROM
items
LEFT OUTER JOIN item_flags ON
items.id = flags.itemid
WHERE
items.levelid = 0 AND
items.containertypeid = 0 AND
items.room = 3 AND
items.userid = 5
GROUP BY
items.id
ORDER BY
items.timemodified DESC
item_flags.timemodified DESC
集計関数で items.id を除くすべての選択フィールドをラップし、ORDER を完全に削除すると、これを機能させることができますが、それらを取得するときにそれらのフィールドを使用する必要があり、それらを順序付けする必要があります! flags.itemid は items.id と等しいと言っていますが、そこには 1 対多の関係があるため、この時点では、クエリのロジックが意味を成すかどうかさえわかりません。
SQL Query - Grouping with multiple tables を見てきましたが、そこには ORDER BY がなく、それを機能させる方法がわかりません!
PG SQL の使用。
ありがとう!
==================================
結局のところ、クエリは MySQL でも動作する必要があり、With は明らかに動作しません。そのため、テストを実行している別のソリューションを思いつきました。他の人にとって役立つ場合に備えて、すぐに投稿します。