Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

MySQL dipesan oleh sebelum dikelompokkan berdasarkan

Menggunakan ORDER BY dalam subquery bukanlah solusi terbaik untuk masalah ini.

Solusi terbaik untuk mendapatkan max(post_date) oleh penulis adalah menggunakan subkueri untuk mengembalikan tanggal maksimum dan kemudian menggabungkannya ke tabel Anda di post_author dan tanggal maksimal.

Solusinya seharusnya:

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

Jika Anda memiliki contoh data berikut:

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

Subquery akan mengembalikan tanggal maksimum dan penulis:

MaxPostDate | Author
2/1/2013    | Jim

Kemudian karena Anda menggabungkannya kembali ke tabel, pada kedua nilai tersebut Anda akan mengembalikan detail lengkap dari pos tersebut.

Lihat SQL Fiddle dengan Demo .

Untuk memperluas komentar saya tentang menggunakan subquery untuk mengembalikan data ini secara akurat.

MySQL tidak memaksa Anda untuk GROUP BY setiap kolom yang Anda sertakan di SELECT daftar. Akibatnya, jika Anda hanya GROUP BY satu kolom tetapi mengembalikan total 10 kolom, tidak ada jaminan bahwa nilai kolom lainnya milik post_author yang dikembalikan. Jika kolom tidak dalam GROUP BY MySQL memilih nilai apa yang harus dikembalikan.

Menggunakan subquery dengan fungsi agregat akan menjamin bahwa penulis dan posting yang benar dikembalikan setiap saat.

Sebagai catatan tambahan, sementara MySQL memungkinkan Anda untuk menggunakan ORDER BY dalam subquery dan memungkinkan Anda untuk menerapkan GROUP BY untuk tidak setiap kolom di SELECT daftar perilaku ini tidak diperbolehkan di database lain termasuk 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. Pernyataan KASUS SQL

  2. Kelas Bersarang - CustomRowMapper !! Bukan Masalah Lagi!! - Bagian 1

  3. Bagaimana melakukan ini di Laravel, subquery di mana di

  4. Menyetel ulang kata sandi ROOT di MySQL 5.6

  5. Tidak dapat terhubung ke server MySQL lokal melalui soket '/var/mysql/mysql.sock' (38)