Задать вопрос

ORDER с GROUP BY в прикрепленной таблице?

Есть запрос, выбирающий блоггеров, их инфы и последней записи
SELECT max(p.post_date), p.post_date,u.ID, u.display_name AS name, ud.meta_value AS bio, yim.meta_value AS yim, u.user_email, u.user_url, p.post_title, p.post_name
FROM wp_users AS u
LEFT JOIN wp_usermeta AS ud ON ( u.ID = ud.user_id AND ud.meta_key =  'description' ) 
LEFT JOIN wp_usermeta AS yim ON ( u.ID = yim.user_id AND yim.meta_key =  'yim' ) 
LEFT JOIN wp_usermeta AS role ON ( u.ID = role.user_id AND role.meta_key =  'wp_capabilities' ) 
LEFT JOIN wp_posts AS p ON ( u.ID = p.post_author ) 
WHERE role.meta_value LIKE  '%blogger%' AND p.post_status =  'publish'
GROUP BY u.ID 
ORDER BY p.post_date DESC


Но статьи Должны быть последними, а в данной ситуации они произвольные;
Вопрос, как выбрать блоггеров с их последней записью, а не предпоследней или еще какой-то?
  • Вопрос задан
  • 145 просмотров
Подписаться 2 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 2
@a1go1ov
Scala fan, Java developer
Я не специалист в MySQL, но вообще по стандарту SQL в блоке select можно указывать только те поля, которые либо указаны в блоке group by (то есть по которым осуществляется группировка), либо передаются в групповую функцию, такую как sum, max и т.д.
Судя по документации, MySQL позволяет не придерживаться данного правила, но тогда для полей не удовлетворяющих озвученным выше условиям выбирается произвольная строка из группы.
Для того, чтобы отключить в MySql расширенное трактование GROUP BY, нужно включить режим ONLY_FULL_GROUP_BY

Относительно вашего запроса, повторная выборка столбца p.post_date, после того как вы указали, что хотите получить записи с последней датой - max(p.post_date), явно не имеет смысла и ломает группировку. Уберите ее, ну и в целом лучше придерживаться стандарта, так ваши запросы будет легче портировать если вы будете мигрировать на другую СУБД, да и недопонимания будет меньше.
Ответ написан
Комментировать
igruschkafox
@igruschkafox
Специалист по сопровождению БД MS SQL
Select ... over (partition by ... ORDER BY ...)
from ..
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы