Можно ли применить LIMIT к сгруппированным результатам, но все же получить все строки? - PullRequest
2 голосов
/ 17 января 2011

У меня есть таблица с книгами, таблица с авторами и таблица с книгами авторов. Книга может иметь более одного автора, поэтому, когда я выполняю большой запрос на , это приводит к , я могу получить более одной строки на книгу, если у книги более одного автора. Затем я объединяю результаты в PHP, но дело в том, что если я ОГРАНИЧУЮ-СМЕЩАЮ запрос на нумерацию страниц, я могу получить менее 25 (желаемых) уникальных книг на страницу.

Может кто-нибудь придумать (или есть встроенный) способ, как LIMIT влияет на сгруппированный запрос, но все же получает все результаты? Я бы предпочел не делать один сгруппированный запрос, а затем делать другие запросы, чтобы получить каждого автора, потому что я теряю преимущество кэшированных результатов.

Если нет, я, вероятно, сделаю предварительный проход, сохранив кэшированные результаты, а затем опрошу каждого автора отдельно.

Ответы [ 3 ]

1 голос
/ 17 января 2011

У меня была точно такая же проблема в другом сценарии использования (система бронирования в театре), и после некоторых исследований и испытаний я использовал предварительный подход.Это быстро и чисто и работает очень хорошо даже с большим количеством строк (в моем случае, более 600 КБ).Надеюсь, поможет!:)

1 голос
/ 20 января 2011

Ответ уже принят, но я думаю, что это может быть полезно.

GROUP_CONCAT позволяет объединить несколько строк в одну строку в запросе MySQL. Используя это, вы можете объединить авторов в список в одно поле.

SELECT GROUP_CONCAT(author) FROM books GROUP BY book_id;

http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat

1 голос
/ 17 января 2011

Вы можете использовать два подхода:

  • Использование n + 1 запросов.
  • Эмулируйте ROW_NUMBER() OVER (PARTITION BY your_group) в MySQL, используя переменные, и выбирайте только строки с номером строки 25 или менее.

Второй довольно сложно правильно написать.

...