Допустим, в my_table миллионы записей.

Вот мой запрос на извлечение строк с определенным именем из списка:

SELECT * FROM my_table WHERE Name IN ('name1','name2','name3','name4')

Как ограничить возвращаемый результат по имени1, имени2 и т. Д.? Следующий запрос ограничит весь результат (до 100).

SELECT * FROM my_table WHERE Name IN ('name1','name2','name3','name4') LIMIT 100

Мне нужно ограничить до 100 для каждого имени.

4
ihtus 6 Июл 2017 в 23:14
1
Чтобы ограничить 100 на имя, вам нужно будет написать 4 (под) запроса, каждый из которых возвращает 100 результатов.
 – 
Norbert van Nobelen
6 Июл 2017 в 23:17
Есть способ сделать это без четырех подзапросов с использованием RANK(), который MySQL, к сожалению, не поддерживает. Ответ Гордона Линоффа, похоже, имитирует функциональность ранжирования.
 – 
McGlothlin
6 Июл 2017 в 23:20
Я знаю, что подать кросс! о, подождите, mySQL ..
 – 
xQbert
6 Июл 2017 в 23:42
Норберт: Я пытался использовать подзапросы с lim в каждом ... но это увеличило время ответа ... И "WHERE Name IN" быстрее, чем подзапросы ...
 – 
ihtus
7 Июл 2017 в 01:00

2 ответа

В MySQL это немного неудобно, но, вероятно, лучший метод - это переменные:

select t.*
from (select t.*,
             (@rn := if(@n = name, @rn + 1,
                        if(@n := name, 1, 1)
                       )
             ) as rn
      from my_table t cross join
           (select @n := '', @rn := 0) params
      order by name
     ) t
where rn <= 100;

Если вы хотите ограничить это подмножеством имен, добавьте в подзапрос предложение where.

Примечание. Если вы хотите выбрать определенные строки - например, самую старую или самую новую, самую большую или самую высокую - просто добавьте второй ключ к order by в подзапросе.

3
Gordon Linoff 6 Июл 2017 в 23:28
Я начал писать ответ, используя RANK, пока не заметил тег MySQL и мне не стало грустно. Протестировал ваш запрос в sqlfiddle, и, похоже, он работает. Хорошее решение. sqlfiddle.com/#!9/6ee5aa/1
 – 
McGlothlin
6 Июл 2017 в 23:24
Гордон: спасибо, но name1, name2 и т. Д. - это список, который я придумал, чтобы упростить задачу. Ваша функция подтянута к формату nameN ... Мой реальный список такой: 1) 400 Zone-Mainline.PLC.Prgm_Zone01.Zone01_LineCycleTime_Hist_x.Zone01_LineCycleTime_Hist_00; 2) 300 Zone-CoverSub.PLC.Prgm_Zone01.Zone01_LineCycleTime_Hist_x.Zone01_LineCycleTime_Hist_00; так далее
 – 
ihtus
7 Июл 2017 в 14:53
. . . Можно только ответить на вопрос, который вы задали, а это и есть. Я бы посоветовал вам задать другой вопрос, предоставив надлежащие образцы данных и объяснение того, что вы хотите сделать.
 – 
Gordon Linoff
7 Июл 2017 в 15:18

Попробуйте SELECT * FROM my_table WHERE Name IN ('name1', 'name2', 'name3', 'name4') ПОЛУЧИТЬ ТОЛЬКО ПЕРВЫЕ 100 СТРОК

-1
Curtis Fore 6 Июл 2017 в 23:39
Всего будет получено 100 строк, а не 100 строк на name .
 – 
McGlothlin
6 Июл 2017 в 23:43
fetch не является допустимым ключевым словом MySQL.
 – 
Jacobm001
6 Июл 2017 в 23:47