2013-02-12 3 views
3

У меня есть что-то вроде этого:MySQL | Оставшись присоединиться к

ID | post_author | post_date | ... | post_title | post_status | ... | post_type 
------------------------------------------------------------------------------- 
1 | 1   | 2007-08-11| ... | A   | publish  | ... | post 
2 | 3   | 2007-08-12| ... | B   | publish  | ... | post 
3 | 1   | 2007-08-12| ... | C   | publish  | ... | post 
4 | 1   | 2007-08-13| ... | D   | publish  | ... | post 
5 | 3   | 2007-08-13| ... | E   | publish  | ... | post 

То, что я хотел бы сделать, это получить количество сообщений пользователя и название и идентификатор последнего поста. На основании вышеприведенных данных должен быть результат, что:

AuthorID | TotalPosts | PostID | PostTitle 
------------------------------------------ 
1  | 3   | 5  | E 
3  | 2   | 4  | D 

То, что я попытался это:

SELECT 
    p1.post_author   AS Author, 
    count(p1.post_author) AS Posts, 
    p2.post_title   AS Title 
FROM 
    wp_posts AS p1 
LEFT JOIN 
    wp_posts As p2 
ON 
    p1.ID = p2.ID 
WHERE 
    p1.post_type = 'post' 
AND 
    p1.post_status = 'publish' 
GROUP BY 
    p1.post_author 
ORDER BY 
    Posts DESC, 
    p2.post_date ASC 
LIMIT 
    2 

Проблема заключается в том, что я всегда получаю название первого поста, а не название последний пост. Есть ли способ получить заголовок последнего вставленного сообщения?

Сердечные приветы

ответ

4

Если вам нужен только последний заголовок для каждого автора, вы можете использовать встроенный коррелированный подзапрос. Это будет относительно быстро с соответствующими индексами - особенно, если вы хотите только результаты для 2 самых издаваемых авторов:

SELECT 
    post_author   AS Author, 
    COUNT(*)   AS Posts, 
    (SELECT p2.post_title 
     FROM  wp_posts AS p2 
     WHERE p2.post_author = p1.post_author 
     AND p2.post_type = 'post' 
     AND p2.post_status = 'publish' 
     ORDER BY p2.post_date DESC 
     LIMIT 1 
    )     AS Title 
FROM 
    wp_posts AS p1 
WHERE 
    post_type = 'post' 
AND 
    post_status = 'publish' 
GROUP BY 
    post_author 
ORDER BY 
    Posts DESC 
LIMIT 
    2 ; 
+0

Там была ошибкой в ​​коррелированном подзапросе. Теперь это исправлено. –

+0

Я попытался бы избавиться от 'ORDER BY' в подзапросе. – Bulat

+1

«ORDER BY p2.post_date DESC» на самом деле там не нужен. Его можно заменить на 'AND p2.post_date = MAX (p1.post_date) ORDER BY anything'. Но я не вижу причин, чтобы избежать «ORDER BY». –

2

Что-то, как это должно работать:

SELECT p.post_author, p3.id, p3.post_title, COUNT(DISTINCT p.id) PostCount 
FROM wp_posts p 
    JOIN (
    SELECT Max(Post_Date) max_post_date, post_author 
    FROM wp_posts 
    GROUP BY post_author) p2 
    ON p.post_author = p2.post_author 
    JOIN wp_posts p3 on p.post_author = p3.post_author 
    AND p2.max_post_date = p3.post_date 
GROUP BY p.post_author, p3.id, p3.post_title 

Это предполагает только один срок за пост. Если нет, будет ли поле вашего идентификатора также полем max?

1

Вы можете проверить, является ли этот вариант быстрее или нет:

SELECT t1.*, t2.post_title FROM 
    (SELECT 
     post_author   AS Author, 
     COUNT(*)   AS Posts, 
     Max(ID) AS MaxID 
    FROM 
     wp_posts AS p 
    WHERE 
     post_type = 'post' AND 
     post_status = 'publish' 
    GROUP BY post_author 
    ORDER BY Posts DESC 
    LIMIT 2) t1 LEFT JOIN wp_posts t2 
       ON t1.MaxID= t2.ID 
+0

'MAX (id)' не эквивалентен 'MAX (post_date)' –

+0

@ypercube, это зависит от реализации, без сомнения. Но я уверен, что мы должны сделать это без 'ORDER BY', даже если ID и post_date не коррелированы. – Bulat

Смежные вопросы