Mysql
 sql >> Database >  >> RDS >> Mysql

MySQL ordina per prima del raggruppamento per

Utilizzando un ORDER BY in una sottoquery non è la soluzione migliore a questo problema.

La migliore soluzione per ottenere il max(post_date) per autore è usare una sottoquery per restituire la data massima e quindi unirla alla tua tabella sia su post_author e la data massima.

La soluzione dovrebbe essere:

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

Se disponi dei seguenti dati di esempio:

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')
;

La sottoquery restituirà la data massima e l'autore di:

MaxPostDate | Author
2/1/2013    | Jim

Quindi, poiché lo stai ricongiungendo alla tabella, su entrambi i valori restituirai i dettagli completi di quel post.

Vedi SQL Fiddle con demo .

Per espandere i miei commenti sull'utilizzo di una sottoquery per restituire questi dati in modo accurato.

MySQL non ti obbliga a GROUP BY ogni colonna che includi in SELECT elenco. Di conseguenza, se solo GROUP BY una colonna ma restituiscono 10 colonne in totale, non vi è alcuna garanzia che gli altri valori di colonna che appartengano a post_author che viene restituito. Se la colonna non è in un GROUP BY MySQL sceglie quale valore deve essere restituito.

L'utilizzo della sottoquery con la funzione di aggregazione garantirà che l'autore e il post corretti vengano restituiti ogni volta.

Come nota a margine, mentre MySQL ti consente di utilizzare un ORDER BY in una sottoquery e ti consente di applicare un GROUP BY a non tutte le colonne in SELECT list questo comportamento non è consentito in altri database incluso SQL Server.