Задавайте вопросы, мы ответим
Вы не зашли.
Здравствуйте.
Подскажите, пожалуйста, как сделать выборку из БД по 10 записей каждого типа ключа category, т.е. выбрать по 10 записей, имеющих одинаковое значение category отсортированных в порядке убывания атрибута date.
И второй вопрос, что из себя будет представлять результат?
Комментарий модератора.
См Выборка последних записей в группах
В этой статье приведено 6 вариантов решения в один запрос.
Неактивен
SELECT * FROM tablename WHERE category = 1 ORDER by `date` DESC LIMIT 10
UNION
SELECT * FROM tablename WHERE category = 2 ORDER by `date` DESC LIMIT 10
...
Будут строки по 10 штук с сортировкой по дате внутри группы. Хорошего способа
сделать так, чтобы список групп подбирался автоматически, нет.
Неактивен
Можно с помощью пользовательских переменных:
http://sqlinfo.ru/forum/viewtopic.php?id=1742
http://sqlinfo.ru/forum/viewtopic.php?id=3492
Неактивен
Но всегда полным сканом?
Неактивен
Ещё вопрос. Стоит ли делать 1 запрос с унионами или лучше сделать 10 запросов.
Имею ввиду, что касательно нагрузки.
Неактивен
Не принципиально, заметной разницы по производительности не будет.
Неактивен
paulus написал:
Но всегда полным сканом?
К сожалению, да.
Неактивен
paulus написал:
SELECT * FROM tablename WHERE category = 1 ORDER by `date` DESC LIMIT 10
UNION
SELECT * FROM tablename WHERE category = 2 ORDER by `date` DESC LIMIT 10
Будут строки по 10 штук с сортировкой по дате внутри группы. Хорошего способа
сделать так, чтобы список групп подбирался автоматически, нет.
Paulus, сори за буквоедство, ты пишешь, что хорошего способа нет, а плохой способ есть? Возможно ли в рамках реляционной базы данных, без пользовательских переменных mysql и хранимых процедур составить такой запрос?
Неактивен
deadka, без переменных будет все с подзапросами. Не запрещается для каждого подзапросом посчитать сколько записей с той же категорией, но с большей датой, а затем наложить условие c<10. Типа такого:
Неактивен
rgbeast, спасибо за ответ. Только такой вариант запроса, к сожалению, не работает, не может в where использовать вычисленное в подзапросе значение.
Отредактированно deadka (07.04.2011 18:33:57)
Неактивен
Прошу прощения, исправил на HAVING
Неактивен
Да, спасибо, теперь работает . Значит на этапе, когда фильтруется "where" подзапросы еще не выполнились, поэтому having..
Неактивен
WHERE по синтаксису работает только с полями исходной таблицы, но не с рассчитанными полями и не с результатами групповых операций. Это допускает оптимизации плана исполнения (например выборка по индексу и др.).
Неактивен