2015-05-29 4 views
0

Есть ли способ установить LIMIT, равный COUNT из DISTINCT записей в строке? У меня есть запрос ниже, и все работает, но LIMIT. Мой стол будет иметь различное количество DISTINCT seriesID, и я хочу последний Эпизод последнего сезона в каждом Distinct seriesID.MYSQL LIMIT on COUNT OF DISTINCT строка

SELECT t1.* FROM myTable.SeriesEpisodes t1 JOIN (SELECT seriesID, MAX(Season) Season FROM myTable.SeriesEpisodes GROUP BY seriesID) t2 ON t1.Season = t2.Season AND t1.seriesID = t2.seriesID ORDER BY Episode DESC LIMIT ???

Я попытался сделать суб запрос, как показано ниже, но это ошибки из.

LIMIT (SELECT COUNT(DISTINCT seriesID) FROM myTable.SeriesEpisodes)

+0

не будет другой 'GROUP BY (t1.seriesID)' выдаст тот же результат, что и ваш? –

+0

Вам не нужно LIMIT - вы уже группируете по серииID, чтобы у вас никогда не появлялось больше строк. – LoztInSpace

+0

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

ответ

1

Этот запрос может возвращать результат, указанный. Встроенный просмотр t2 возвращает максимальный сезон для каждой серии. Встроенный просмотр t3 возвращает максимальный эпизод для каждого сезона каждой серии. Результаты из встроенных представлений (производных таблиц) могут быть объединены с исходной таблицей, чтобы получить строку подробностей, связанную с этими максимальными значениями. (Это предполагает, что (Series,Season,Episode) кортеж является уникальным.)

SELECT t1.* 
    FROM myTable.SeriesEpisodes t1 
    JOIN (SELECT s2.Series 
       , MAX(s2.Season) AS Season 
      FROM myTable.SeriesEpisodes s2 
      GROUP 
      BY s2.Series 
     ) t2 
    ON t2.Series = t1.Series 
    AND t2.Season = t1.Season 
    JOIN (SELECT s3.Series 
       , s3.Season 
       , MAX(s3.Episode) AS Episode 
      FROM myTable.SeriesEpisodes s3 
      GROUP 
      BY s3.Series 
       , s3.Season 
     ) t3 
    ON t3.Series = t1.Series 
    AND t3.Season = t1.Season 
    AND t3.Episode = t1.Episode 
ORDER 
    BY t1.Series 
    , t1.Season 

РЕДАКТИРОВАТЬ

--или--

Эквивалентный результат может быть возвращен с запросом, как это. Внутренний вид t2 возвращает последний Эпизод последнего сезона для каждой серии.

SELECT t1.* 
    FROM myTable.SeriesEpisodes t1 
    JOIN (SELECT s2.Series 
       , s2.Season 
       , MAX(s2.Episode) AS Episode 
      FROM myTable.SeriesEpisodes s2 
      JOIN (SELECT s3.Series 
         , MAX(s3.Season) AS Season 
        FROM myTable.SeriesEpisodes s3 
        GROUP 
         BY s3.Series 
       ) t3 
      ON t3.Series = s2.Series 
      AND t3.Season = s2.Season 
      GROUP 
      BY s2.Series 
       , s2.Season 
     ) t2 
    ON t2.Series = t1.Series 
    AND t2.Season = t1.Season 
    AND t2.Episode = t1.Episode 
ORDER 
    BY t1.Series 
    , t1.Season 
+0

Отлично! Первый работает отлично! Есть ли возможность использовать любой из двух или двух? – Wingman1487

+0

Думаю, второй лучше. Встроенное представление 't2' возвращает максимальное значение Эпизода для максимального сезона. Первый запрос, мы получаем максимальный Эпизод за каждый Сезон, который больше строк «максимального эпизода», чем нам действительно нужно. Что касается производительности, я не думаю, что будет большая разница ... для обоих мы хотим, чтобы соответствующие индексы определялись 'ON SeriesEpisodes (Series, Season, Episode)'. Мы посмотрим на результат EXPLAIN и наблюдаем производительность (убедитесь, что мы обходим кеш запросов, если это включено, включив подсказку NOCACHE.) – spencer7593

+0

Прохладный! Они оба работают, и я вижу, что логика второй - немного лучше. Производительность не огромна, так как таблица не такая большая (по крайней мере пока). Спасибо тонну за подробный ответ! – Wingman1487