Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Zamów MySQL przed Grupuj według

select wp_posts.* from wp_posts
where wp_posts.post_status='publish'and wp_posts.post_type='post'
group by wp_posts.post_author
having wp_posts.post_date = MAX(wp_posts.post_date) /* ONLY THE LAST POST FOR EACH AUTHOR */
order by wp_posts.post_date desc

EDYTUJ:

Po kilku komentarzach postanowiłem dodać kilka dodatkowych informacji.

Firma, w której pracuję, również korzysta z Postgresa, a zwłaszcza SQL Server. Te bazy danych nie pozwalają na takie zapytania. Więc wiem, że jest na to inny sposób (poniżej piszę rozwiązanie). Powinieneś także wiedzieć, co robisz, jeśli nie grupujesz według wszystkich kolumn traktowanych w projekcji lub nie używasz funkcji agregujących. W przeciwnym razie niech tak będzie!

Wybrałem rozwiązanie powyżej, bo to konkretne pytanie. Tomek chce uzyskać najnowszy post dla każdego autora w witrynie Wordpress. Moim zdaniem nie ma znaczenia, czy autor robi więcej niż jeden post na sekundę. Wordpress powinien nawet zabronić tego przez wykrywanie spamu-double-post. Wiem z własnego doświadczenia, że ​​robienie tak brudnej grupy przez MySQL przynosi naprawdę znaczące korzyści. Ale jeśli wiesz, co robisz, możesz to zrobić! Mam takie brudne grupy w aplikacjach, za które odpowiadam zawodowo. Tutaj mam tabele z kilkoma milionami wierszy, które wymagają 5-15 sekund zamiast 100++ sekund.

Może być przydatny w przypadku niektórych zalet i wad:http://ftp.nchu.edu.tw/MySQL/tech-resources/articles/debunking-group-by-myths.html

SELECT
    wp_posts.*
FROM 
    wp_posts
    JOIN 
    (
        SELECT
            g.post_author
            MAX(g.post_date) AS post_date
        FROM wp_posts as g
        WHERE
            g.post_status='publish'
            AND g.post_type='post'
        GROUP BY g.post_author
    ) as t 
    ON wp_posts.post_author = t.post_author AND wp_posts.post_date = t.post_date

ORDER BY wp_posts.post_date

Ale jeśli autor ma więcej niż jeden post na sekundę, otrzymasz więcej niż jeden wiersz, a nie jedyny ostatni .

Teraz możesz ponownie zakręcić kołem i uzyskać post z najwyższym Id . Nawet tutaj nie ma przynajmniej gwarancji, że naprawdę dostaniesz ostatni.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wyodrębnianie podciągów MySQL za pomocą separatora

  2. Wygeneruj sekwencję liczb całkowitych w MySQL

  3. SQL:Jaka jest domyślna kolejność zapytań?

  4. Zapobiegaj atakom typu SQL injection w programie Java

  5. Grupowanie klauzul WHERE w Codeigniter