0

次のようなテーブルを持つデータベースにクエリを作成する必要があります。

TABLE HISTORY:
ID | ITEM_ID | USER_ID | DATE

ITEM TABLE:
ID | NAME | OWNER_ID

履歴テーブルには、ユーザーによるアイテムのすべての操作の記録が含まれています。HISTORY テーブルからすべての項目を取得するクエリを作成する必要がありますが、それらは所有者の手にありません。したがって、各アイテムの最後のレコードを取得し、所有者以外の手に保持されているもののみを選択する必要があります。

ネストされたクエリを使用して記述しようとしましたが、そのようなサブクエリを使用している場合:

SELECT ITEM_ID, MAX(DATE) 
FROM HISTORY
GROUP BY ITEM_ID

このレコードの ID を取得できません。したがって、ID の ID がわからないため、ネストされたクエリの結果をループできません。

私たちを手伝ってくれますか?

PSそして、group by句を使用したクエリから、group byステートメントにない列を取得する方法を教えてください。

4

1 に答える 1

4

質問に対する私の理解では、最新の履歴エントリが所有者以外のユーザーによって作成されたすべてのアイテムが必要です。私が間違っている場合は、私を修正してください。

select h.item_id
from item i
    inner join history h
        on h.item_id = i.id and i.owner_id != h.user_id
    inner join (select item_id, max(id), max(date) as date
                from history
                group by item_id) mh
        on mh.item_id = h.item_id and h.date = mh.date

上記のクエリは、日付列の一意性がある程度保証されている日時を想定しています。そうでない場合は、history.id が完全に自動インクリメントされる ID 列であり、誰もいじらせないことを約束する場合に使用できる可能性があります (わかりました、それほど厳密ではないかもしれませんが、私の主張は理解できます)。

この場合:

select h.item_id
from item i
    inner join history h
        on h.item_id = i.id and i.owner_id != h.user_id
    inner join (select item_id, max(id) as id
                from history
                group by item_id) mh
        on mh.id = h.id
于 2010-11-30T21:03:32.363 に答える