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