SELECT Where ID in (Список идентификаторов) и ограничение записей каждого идентификатора в MySQL - PullRequest
0 голосов
/ 31 декабря 2018

Я столкнулся с ситуацией, когда у меня есть список идентификаторов таблицы магазина, и мне нужно получить последние 10 файлов из каждого магазина.

SELECT * 
FROM tblFiles 
WHERE storeId in (IDs) 
ORDER BY createdDate DESC  
LIMIT 10

Но это ограничивает результаты в целом.Я нашел ответ на подобный ТАК вопрос .Но, ответ рекомендует использовать цикл для каждого идентификатора.Это приводит к попаданию в несколько БД.

Другой вариант - извлечь все записи и сгруппировать их в коде.Но это будет тяжело, если будет много записей.

Было бы хорошо, если бы это можно было обработать на уровне запроса.Любая помощь будет оценена.

Примечание: Используемые здесь таблицы являются фиктивными.

Ответы [ 3 ]

0 голосов
/ 31 декабря 2018

используйте выбор, где

SELECT * from tblFiles where storeId in (SELECT id from store ORDER BY datefield/id field desc limit 10)
0 голосов
/ 31 декабря 2018

Pre-MySQL 8.0, самый простой метод - это, вероятно, переменные:

select f.*
from (select f.*,
             (@rn := if(@s = storeId, @rn + 1,
                        if(@s := storeId, 1, 1)
                       )
             ) as rn
      from (select f.*
            from tblfiles f
            where storeId in (IDs) 
            order by storeId, createdDate desc
           ) f cross join
           (select @s := 0, @rn := 0) params
     ) f
where rn <= 10;

В MySQL 8+ или MariaDB 10.3+ вы просто используете оконные функции:

select f.*
from (select f.*,
             row_number() over (partition by storeid order by createdDate desc) as seqnum
      from tblfiles f
     ) f
where seqnum <= 10;

ВВ старых версиях MySQL и MariaDB внутренний подзапрос может не понадобиться.

0 голосов
/ 31 декабря 2018

Вы можете обойти его с помощью запроса UNION, где каждый подзапрос выполняет поиск определенного идентификатора и применяет условие LIMIT, например:

(SELECT * 
FROM tblFiles
WHERE storeId = ?
ORDER BY createdDate DESC
LIMIT 10)
UNION
(SELECT * 
FROM tblFiles
WHERE storeId = ?
ORDER BY createdDate DESC
LIMIT 10)
...

С этим решением произойдет только одно попадание в дб, и выгарантия получения LIMIT на основе идентификатора.Такой SQL может быть легко сгенерирован из кода php.

Nb: максимально допустимое число UNION в запросе mysql составляет 61.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...