MYSQL топ N строк из объединения нескольких таблиц - PullRequest
5 голосов
/ 12 февраля 2010

Например, в SQL Server 2005 есть ключевое слово top, как выбрать первую строку в mysql, если у меня есть объединение в нескольких таблицах и я хочу получить экстремум каждого идентификатора / столбца. Предел ограничивает нет. строки возвращается, поэтому она не может решить мою проблему.

Ответы [ 2 ]

3 голосов
/ 12 февраля 2010
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

Последнее более эффективно, если в ваших документах обычно мало изменений, и вам нужно выбрать все или почти все документы; первый более эффективен, если в документах много ревизий или вам нужно выбрать только небольшой набор документов.

Обновление:

Извините, не заметил вопрос о 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 голосов
/ 12 февраля 2010

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