сложная выборка в одном запросе mysql

Рейтинг: 1Ответов: 2Опубликовано: 06.04.2015

Новостной личный сайт (в стадии разработки). Нажимая на пункт меню "Рубрики" пользователь должен увидеть таблицу - список категорий с указанием количества записей в каждой категории и дату последней записи. Это я сделал, получается типа этого:

скрин

Структура БД: таблица "pages" содержит все записи. Основные поля:

id     - первичный ключ,
id_cat - идентификатор категории,
content - содержимое,
date    - дата внесения записи.

таблица "category" имеет два поля:

id_cat - идентификатор категории,
category - само текстовое название категории

Код:

SELECT c.id_cat, c.category, COUNT(p.id_cat), MAX(p.date)
FROM category AS c 
LEFT JOIN pages AS p ON c.id_cat=p.id_cat
GROUP BY c.id_cat
ORDER BY c.id_cat DESC

Хотелось бы сделать, чтобы дата последней публикации была активной ссылкой на соответствующую запись. Можно ли все это объединить в одном запросе, вытащив каким-то образом id публикации с MAX(p.date)?

Ответы

▲ 2Принят
SELECT 
c.id_cat, 
c.category, 
COUNT(p.id_cat), 
MAX(p.date),
(SELECT max(id) FROM pages WHERE id_cat=c.id_cat and date = MAX(p.date))
FROM category AS c 
LEFT JOIN pages AS p ON c.id_cat=p.id_cat
GROUP BY c.id_cat
ORDER BY c.id_cat DESC

Примерно так. В общем в разделе SELECT еще подразпрос напишите. Ведь вы для этой строки знаете ID_категории и максимальную дату публикации, значит вам нужно вытащить туда максимальный ID публикации на эту дату.

▲ 1

Если запись с большей датой всегда имеет больший id, то

SELECT c.id_cat, c.category, COUNT(p.id_cat), MAX(p.date), MAX(p.id)
FROM category AS c 
LEFT JOIN pages AS p ON c.id_cat=p.id_cat
GROUP BY c.id_cat
ORDER BY c.id_cat DESC

В противном случае есть как минимум 5 способов, см статью Группировка в MySQL