Mysql
 sql >> база данни >  >> RDS >> Mysql

MySQL подреждане по преди групиране по

Използване на ORDER BY в подзаявка не е най-доброто решение на този проблем.

Най-доброто решение за получаване на max(post_date) от автор е да използвате подзаявка, за да върнете максималната дата и след това да я присъедините към вашата таблица и в post_author и максималната дата.

Решението трябва да бъде:

SELECT p1.* 
FROM wp_posts p1
INNER JOIN
(
    SELECT max(post_date) MaxPostDate, post_author
    FROM wp_posts
    WHERE post_status='publish'
       AND post_type='post'
    GROUP BY post_author
) p2
  ON p1.post_author = p2.post_author
  AND p1.post_date = p2.MaxPostDate
WHERE p1.post_status='publish'
  AND p1.post_type='post'
order by p1.post_date desc

Ако имате следните примерни данни:

CREATE TABLE wp_posts
    (`id` int, `title` varchar(6), `post_date` datetime, `post_author` varchar(3))
;

INSERT INTO wp_posts
    (`id`, `title`, `post_date`, `post_author`)
VALUES
    (1, 'Title1', '2013-01-01 00:00:00', 'Jim'),
    (2, 'Title2', '2013-02-01 00:00:00', 'Jim')
;

Подзаявката ще върне максималната дата и автора на:

MaxPostDate | Author
2/1/2013    | Jim

След това, тъй като го присъединявате обратно към таблицата, и за двете стойности ще върнете пълните подробности за тази публикация.

Вижте SQL Fiddle с демонстрация .

За да разширя коментарите си относно използването на подзаявка за точно връщане на тези данни.

MySQL не ви принуждава да GROUP BY всяка колона, която включвате в SELECT списък. В резултат на това, ако само GROUP BY една колона, но връща общо 10 колони, няма гаранция, че стойностите на другите колони, които принадлежат на post_author което се връща. Ако колоната не е в GROUP BY MySQL избира каква стойност трябва да бъде върната.

Използването на подзаявката с агрегатната функция ще гарантира, че точният автор и публикация се връщат всеки път.

Като странична забележка, докато MySQL ви позволява да използвате ORDER BY в подзаявка и ви позволява да приложите GROUP BY до не всяка колона в SELECT списък това поведение не е разрешено в други бази данни, включително SQL Server.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL LN() Функция – Връща естествения логаритъм на число

  2. Не може да върне резултати от съхранената процедура с помощта на курсора на Python

  3. Как да инсталирате MySQL с phpMyAdmin на Debian 7

  4. mysqli_query() очаква поне 2 параметъра, 1 е даден?

  5. Как да получите разликата в годините от две различни дати?