SQL группа по проблеме - PullRequest
       28

SQL группа по проблеме

0 голосов
/ 30 ноября 2010

Я должен написать запрос в базу данных, которая имеет такую ​​таблицу:

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 этой записи. Поэтому я не могу просмотреть результаты вложенных запросов, поскольку не знаю идентификатора их идентификаторов.

Не могли бы вы помочь мне?

P.S. И не могли бы вы посоветовать мне в будущем, как взять из запросов с group by предложение столбцы, которые не в group by Statement?

1 Ответ

4 голосов
/ 01 декабря 2010

Мое понимание вопроса заключается в том, что вы хотите, чтобы все элементы, последние записи в истории которых были сделаны пользователем, не являющимся владельцем.Пожалуйста, исправьте меня, если я ошибаюсь.

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, если это абсолютно автоматически увеличивающийся столбец идентификаторов, и вы обещаете никогда не позволять кому-либо связываться (хорошо, может быть, не так строго, но вы понимаете, о чем я).

В этом случае:

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
...