2

私はこれを処理しようとしてきましたが、運がなかったので、誰かが私を助けてくれるとうれしいです.

私は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 は明らかに動作しません。そのため、テストを実行している別のソリューションを思いつきました。他の人にとって役立つ場合に備えて、すぐに投稿します。

4

3 に答える 3

1

次の GROUP BY を使用できます

GROUP BY
            items.id,
            items.name,   
            items.levelid,
            items.containertypeid,
            items.roomid,
            items.userid

items.id は一意であるため、これは "GROUP BY items.id" と同じようにレコードをグループ化します。

これはデータベースにとってより多くの作業のように思えるかもしれませんが、グループ化の ID をチェックするだけでよいかどうかを判断するのはデータベース次第です。

于 2013-04-18T16:03:09.350 に答える
-1

そのため、最終的には次のように決定しました。

SELECT 
items.id, 
max(items.name) as name,
max(item_flags.flagid) as flagid,
max(COALESCE(item_flags.timestamp, items.timestamp)) AS tm
FROM   
items
LEFT JOIN 
item_flags 
ON 
item_flags.itemid = items.id 
GROUP BY items.id 
ORDER BY tm DESC
于 2013-04-22T13:29:29.843 に答える