2010-02-12 2 views
5

Как, есть ключевое слово top в sql server 2005, как выбрать верхнюю 1 строку в mysql, если я присоединюсь к нескольким таблицам & хотят получить крайние из каждого ID/столбца. Предел ограничивает число. строки возвращает, поэтому он не может решить мою проблему.MYSQL top N строк из нескольких табличных объединений

+0

Может быть, пример? – hsz

+0

Да, вопрос не очень ясен. Я просто догадался –

+0

Вопрос не очень ясен, но я предполагаю, что это еще один случай проблемы «наибольшая-на-группа», которая часто возникает. –

ответ

3
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) для этого, чтобы работать быстро.

+0

MySQL не поддерживает 'APPLY' или' ROW_NUMBER() '(функции окна). –

+0

@Bill: право, не заметил, что речь идет о 'MySQL'. – Quassnoi

+0

Позже ответ работает, но что, если для некоторых строк у меня есть только одна запись ex: версия имеет только одну запись для определенного docID, в этом случае запрос не получает строк для этого идентификатора. Извините за поздний ответ/комментарий –

0

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