Как, есть ключевое слово top в sql server 2005, как выбрать верхнюю 1 строку в mysql, если я присоединюсь к нескольким таблицам & хотят получить крайние из каждого ID/столбца. Предел ограничивает число. строки возвращает, поэтому он не может решить мою проблему.MYSQL top N строк из нескольких табличных объединений
ответ
SELECT v.*
FROM document d
OUTER APPLY
(
SELECT TOP 1 *
FROM version v
WHERE v.document = d.id
ORDER BY
v.revision DESC
) v
или
SELECT v.*
FROM document d
LEFT JOIN
(
SELECT *, ROW_NUMBER() OVER (PARTITION BY v.id ORDER BY revision DESC)
FROM version
) v
ON v.document = d.id
AND v.rn = 1
Последнее является более эффективным, если ваши документы, как правило, имеют несколько ревизий, и вы должны выбрать все или почти все документы; первый более эффективен, если документы имеют много изменений или вам нужно выбрать только небольшое подмножество документов.
Update:
К сожалению, не заметил, вопрос о MySQL
.
В MySQL
, вы делаете это таким образом:
SELECT *
FROM document d
LEFT JOIN
version v
ON v.id =
(
SELECT id
FROM version vi
WHERE vi.document = d.document
ORDER BY
vi.document DESC, vi.revision DESC, vi.id DESC
LIMIT 1
)
Создание составного индекса на version (document, revision, id)
для этого, чтобы работать быстро.
MySQL не поддерживает 'APPLY' или' ROW_NUMBER() '(функции окна). –
@Bill: право, не заметил, что речь идет о 'MySQL'. – Quassnoi
Позже ответ работает, но что, если для некоторых строк у меня есть только одна запись ex: версия имеет только одну запись для определенного docID, в этом случае запрос не получает строк для этого идентификатора. Извините за поздний ответ/комментарий –
Если вы меня правильно поняли, верхняя часть также не решит вашу проблему. вершина точно эквивалентна пределу. То, что вы ищете, - это совокупные функции, такие как max() или min(), если вы хотите получить крайности. например:
select link_id, max(column_a), min(column_b) from table_a a, table_b b
where a.link_id = b.link_id group by link_id
Может быть, пример? – hsz
Да, вопрос не очень ясен. Я просто догадался –
Вопрос не очень ясен, но я предполагаю, что это еще один случай проблемы «наибольшая-на-группа», которая часто возникает. –