Поиск последнего сообщения по автору - PullRequest
1 голос
/ 01 сентября 2009

Я создаю страницу "авторов" для моего блога Wordpress, в которой перечисляются все текущие авторы сайта, а также различную другую информацию, такую ​​как количество опубликованных сообщений, дата их последнего сообщения и т. Д.

Google и Кодекс Wordpress указали мне на использование подзапросов в MySQL для извлечения всех необходимых мне данных в одном запросе, и это прекрасно работает для получения количества опубликованных постов на автора.

То, что я не могу получить, - это нахождение идентификатора поста для последнего поста для каждого автора.

Текущий запрос, без последнего сообщения:

SELECT users.ID, (SELECT count(*) FROM posts, users WHERE users.ID = posts.post_author AND posts.post_type = 'post' AND posts.post_status = 'publish') AS post_count FROM users ORDER BY post_count DESC

Моя попытка получить последний пост ID для каждого автора ('latest_post_ID'):

SELECT users.ID, (SELECT count(*) FROM posts, users WHERE users.ID = posts.post_author AND posts.post_type = 'post' AND posts.post_status = 'publish') AS post_count, (SELECT posts.ID FROM posts, users WHERE users.ID = posts.post_author AND posts.post_type = 'post' AND posts.post_status = 'publish' ORDER BY posts.post_date DESC LIMIT 1) AS latest_post_ID FROM users ORDER BY post_count DESC

Проблема заключается в добавленном подзапросе - запрос найдет все опубликованные посты, которые соответствуют любому автору, а не тому, что я собираюсь ('users.ID = posts.post_author').

Я был бы очень признателен, если бы кто-то с каким-то SQL-фу мог указать, где я неправильно использую и / или злоупотребляю подзапросами MySQL.

Ответы [ 3 ]

3 голосов
/ 01 сентября 2009
  SELECT u.id,
         COUNT(*) AS post_count,
         MAX(p.id) AS latest_post_id
    FROM POSTS p
    JOIN USERS u ON u.ID = p.post_author 
   WHERE p.post_type = 'post' 
     AND p.post_status = 'publish'
GROUP BY u.id
ORDER BY post_count DESC

Я не рекомендую использовать SELECTS в предложении SELECT. Пока они работают, они обеспечат худшую производительность.

2 голосов
/ 01 сентября 2009

Попробуйте это.

SELECT a.ID, 

(SELECT count(*) 
FROM posts 
WHERE a.ID = posts.post_author 
AND posts.post_type = 'post' 
AND posts.post_status = 'publish') AS post_count, 

(SELECT posts.ID 
FROM posts 
WHERE a.ID = posts.post_author 
AND posts.post_type = 'post' 
AND posts.post_status = 'publish' 
ORDER BY posts.post_date DESC LIMIT 1) AS latest_post_ID 

FROM users As a 
ORDER BY post_count DESC
0 голосов
/ 01 сентября 2009

Следующий запрос должен работать в MySQL:

SELECT posts.ID FROM posts,
(SELECT MAX(posts.post_date) AS max_date,
posts.post_author AS author

FROM posts 

WHERE users.ID = posts.post_author 

GROUP BY posts.post_author) AS max_date_table

WHERE posts.post_date = max_date_table.max_date AND
posts.post_author = max_date_table.author
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...