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

Uporządkuj MySQL według przed pogrupuj według

Korzystanie z ORDER BY w podzapytaniu nie jest najlepszym rozwiązaniem tego problemu.

Najlepsze rozwiązanie, aby uzyskać max(post_date) przez autora jest użycie podzapytania do zwrócenia maksymalnej daty, a następnie dołączenie jej do tabeli na obu post_author i maksymalną datę.

Rozwiązaniem powinno być:

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

Jeśli masz następujące przykładowe dane:

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

Podzapytanie zwróci maksymalną datę i autora:

MaxPostDate | Author
2/1/2013    | Jim

Następnie, ponieważ dołączasz do tego z powrotem do tabeli, dla obu wartości zwrócisz pełne szczegóły tego postu.

Zobacz SQL Fiddle z wersją demonstracyjną .

Aby rozwinąć moje uwagi dotyczące używania podzapytania do dokładnego zwracania tych danych.

MySQL nie zmusza cię do GROUP BY każdą kolumnę, którą uwzględnisz w SELECT lista. W rezultacie, jeśli tylko GROUP BY jedna kolumna, ale zwraca łącznie 10 kolumn, nie ma gwarancji, że inne wartości kolumn należą do post_author który jest zwracany. Jeśli kolumna nie znajduje się w GROUP BY MySQL wybiera, jaka wartość powinna zostać zwrócona.

Użycie podzapytania z funkcją agregującą zagwarantuje, że za każdym razem zostanie zwrócony prawidłowy autor i post.

Na marginesie, podczas gdy MySQL pozwala na użycie ORDER BY w podzapytaniu i pozwala zastosować GROUP BY do nie każdej kolumny w SELECT wymień to zachowanie jest niedozwolone w innych bazach danych, w tym w 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. Jak przesłać obrazy do bazy danych MySQL za pomocą kodu PHP?

  2. Hibernate 5:- org.hibernate.MappingException:Nieznana jednostka

  3. PHP, MySQL i strefy czasowe

  4. Wiele zapytań wykonywanych w java w jednej instrukcji

  5. Jak zamienić część ciągu w MySQL