Проблема присоединения по наибольшему значению в таблице MySQL - PullRequest
3 голосов
/ 01 октября 2008

У меня есть таблица продуктов ...

альтернативный текст http://img357.imageshack.us/img357/6393/productscx5.gif

и таблица редакций, которая должна отслеживать изменения в информации о продукте

альтернативный текст http://img124.imageshack.us/img124/1139/revisionslz5.gif

Я пытаюсь запросить базу данных для всех продуктов с их последней редакцией ...

select
*
from `products` as `p`
left join `revisions` as `r` on `r`.`product_id` = `p`.`product_id`
group by `p`.`product_id`
order by `r`.`modified` desc

но я всегда просто получаю первую ревизию. Мне нужно сделать это в один выбор (т.е. без подзапросов). Я могу управлять этим в mssql, это вообще возможно в mysql?

Ответы [ 3 ]

4 голосов
/ 02 октября 2008

Вот как бы я это сделал:

SELECT p.*, r.*
FROM products AS p
  JOIN revisions AS r USING (product_id)
  LEFT OUTER JOIN revisions AS r2 
    ON (r.product_id = r2.product_id AND r.modified < r2.modified)
WHERE r2.revision_id IS NULL;

Другими словами: найдите ревизию, для которой не существует другой ревизии с тем же product_id и большим измененным значением.

1 голос
/ 01 октября 2008

Даты начала и окончания в вашей таблице истории сделают это возможным (оставляя самую последнюю дату окончания нулевой и ставят отметки даты окончания в предыдущей записи при вставке новой)

В противном случае вам придется использовать подзапрос.

0 голосов
/ 01 октября 2008

Этот же запрос может быть обработан в MySQL.

Почему вы используете левое соединение вместо внутреннего соединения или правое соединение?

Также, если вы хотите по-другому, у вас есть функция МАКС.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...