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

MYSQL - Pesan Berdasarkan Id Dalam Urutan DESC, Kelompokkan Berdasarkan X

Anda telah salah memahami bagaimana GROUP BY bekerja di SQL, karena fitur MySQL. Dalam SQL standar setiap kolom non agregat dalam pernyataan SELECT HARUS dalam klausa GROUP BY (ada pengecualian untuk kolom yang nilainya 100% bergantung pada kolom yang sudah ada dalam klausa GROUP BY, meskipun beberapa rasa SQL mendukung pengecualian ini) .

MySQL tidak menerapkan ini secara default, tetapi nilai baris mana yang digunakan untuk kolom tersebut tidak ditentukan. Meskipun Anda mungkin mendapatkan yang Anda inginkan, Anda juga mungkin tidak. Dan bahkan jika Anda melakukannya, ada kemungkinan itu akan berubah di masa depan.

Pengurutan tidak bergantung pada GROUP BY secara normal, meskipun jika Anda tidak menentukan klausa ORDER maka hasilnya akan diurutkan berdasarkan apa yang diperlukan untuk melakukan GROUPing (yaitu, jika membantu mengurutkan baris dalam satu urutan untuk melakukan GROUP BY maka MySQL tidak akan repot-repot mengurutkan ulang record setelahnya kecuali Anda secara khusus memerintahkannya dengan klausa ORDER BY).

Jadi dengan data Anda saat ini, pengelompokan berdasarkan ads_post_id nilai id yang dikembalikan bisa menjadi 22, 23, 24, 104, 250, 253 atau 767. Yang mana yang dipilih MySQL untuk digunakan tidak ditentukan.

Dengan perbaikan data Anda saat ini, ini sepele karena Anda hanya bisa mendapatkan id MAX:-

SELECT ads_post_id, MAX(id) 
FROM fb_ads 
GROUP BY ads_post_id 
LIMIT 6

MAX akan mengembalikan 1 baris untuk setiap nilai GROUPed.

Masalah normalnya adalah orang menginginkan kolom lain untuk baris itu. Misalnya, katakanlah bahwa setiap baris dalam data sampel Anda juga memiliki alamat IP, dan Anda menginginkan yang sama dengan id tertinggi untuk ads_post_id:-

id   | ads_post_id         ip_address
---------------------------------------------------------------------------
22   | 983314845117571     192.168.0.0
23   | 983314845117571     192.168.0.5
24   | 983314845117571     192.168.0.7    
104  | 983314845117571     192.168.0.0
250  | 983314845117571     192.168.0.4
253  | 983314845117571     192.168.0.6
767  | 983314845117571     192.168.0.1     
---------------------------------------------------------------------------

Dalam hal ini Anda tidak bisa hanya menggunakan MAX. Misalnya jika Anda mencoba:-

SELECT ads_post_id, MAX(id), MAX(ip_address) 
FROM fb_ads 
GROUP BY ads_post_id 
LIMIT 6

Anda akan mendapatkan data berikut dikembalikan

id   | ads_post_id         ip_address
---------------------------------------------------------------------------
767  | 983314845117571     192.168.0.7     
---------------------------------------------------------------------------

Jika Anda mencoba yang berikut ini di sebagian besar rasa SQL, Anda akan mendapatkan kesalahan. Di MySQL dengan pengaturan default, Anda akan mendapatkan hasil, tetapi alamat IP mana yang dikembalikan tidak ditentukan (dan berlaku acak).

SELECT ads_post_id, MAX(id), ip_address 
FROM fb_ads 
GROUP BY ads_post_id 
LIMIT 6

Solusi untuk ini adalah mendapatkan id maksimal untuk setiap ads_post_id dalam sub kueri dan kemudian menggabungkannya kembali ke tabel untuk mendapatkan nilai lainnya:-

SELECT a.ads_post_id,
        a.id,
        a.ip_address
FROM fb_ads a
INNER JOIN
(
    SELECT ads_post_id, MAX(id) AS max_id 
    FROM fb_ads 
    GROUP BY ads_post_id 
) sub0
ON a.ads_post_id = sub0.ads_post_id
AND a.id = sub0.max_id

Alternatifnya adalah (ab) menggunakan fungsi agregat GROUP_CONCAT. GROUP_CONCAT akan mengembalikan semua nilai yang digabungkan menjadi 1 bidang, masing-masing dipisahkan oleh , (secara default). Anda dapat menambahkan klausa ORDER BY untuk memaksa urutan mereka digabungkan. Anda dapat menggunakan SUBSTRING_INDEX untuk mengembalikan semuanya ke koma pertama.

Ini bisa berguna untuk data sederhana, tetapi menjadi masalah dengan data teks atau bidang yang maksimal NULL.

SELECT a.ads_post_id,
        SUBSTRING_INDEX(GROUP_CONCAT(id ORDER BY id DESC), ',', 1),
        SUBSTRING_INDEX(GROUP_CONCAT(ip_address ORDER BY id DESC), ',', 1)
FROM fb_ads 
GROUP BY ads_post_id 


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mendapatkan respons HTML alih-alih JSON di android

  2. Memasukkan file gambar dengan PyQt5 di kolom tabel database MySQL

  3. Peringatan penaut saat membangun aplikasi terhadap mysql-connector-c/libmysqlclient/mysql C API

  4. Akses Ditolak untuk MYSQL ERROR 1045

  5. Sistem penandaan:Pertanyaan solusi toksik