GROUP BY
Toplama işlevi olmadan kullanıldığında, kabul edilen yanıtta kullanıldığı gibi, beklenmedik sonuçlardan kaçınmak için , MySQL bir toplama işlevi [sic] ve sorunları kullanılmadığında gruplanan veri kümesindeki HERHANGİ bir değeri almakta serbesttir . Lütfen bir hariç tutma katılımı kullanmayı düşünün.ONLY_FULL_GROUP_BY
Hariç Tutma Katılımı - Belirsiz Varlıklar
Adın ve soyadının benzersiz bir şekilde dizine eklendiğini (açık) varsayarsak, alternatif olarak sonuç kümesini filtrelemek GROUP BY
için a'yı kullanarak LEFT JOIN
hariç tutma JOIN olarak sıralamaktır.
Gösteriye bakın
Artan düzen (AZ)
AZ'den soyadı tarafından sıralanan ayrı adı almak için
Sorgu
SELECT t1.*
FROM table_name AS t1
LEFT JOIN table_name AS t2
ON t1.firstname = t2.firstname
AND t1.lastname > t2.lastname
WHERE t2.id IS NULL;
Sonuç
| id | firstname | lastname |
|----|-----------|----------|
| 2 | Bugs | Bunny |
| 1 | John | Doe |
Azalan düzen (ZA)
ZA'dan soyadı tarafından sıralanan ayrı adı almak için
Sorgu
SELECT t1.*
FROM table_name AS t1
LEFT JOIN table_name AS t2
ON t1.firstname = t2.firstname
AND t1.lastname < t2.lastname
WHERE t2.id IS NULL;
Sonuç
| id | firstname | lastname |
|----|-----------|----------|
| 2 | Bugs | Bunny |
| 3 | John | Johnson |
Daha sonra, elde edilen verileri istediğiniz gibi sipariş edebilirsiniz.
Hariç Tutma Katılımı - Belirsiz Varlıklar
Ad ve soyadı birleşimi benzersiz değilse (belirsiz) ve aynı değerlere sahip birden çok satırınız varsa, kimliğe göre de filtrelemek için JOIN ölçütlerine OR koşulu ekleyerek sonuç kümesine filtre uygulayabilirsiniz.
Gösteriye bakın
tablo_adı verileri
(1, 'John', 'Doe'),
(2, 'Bugs', 'Bunny'),
(3, 'John', 'Johnson'),
(4, 'John', 'Doe'),
(5, 'John', 'Johnson')
Sorgu
SELECT t1.*
FROM table_name AS t1
LEFT JOIN table_name AS t2
ON t1.firstname = t2.firstname
AND (t1.lastname > t2.lastname
OR (t1.firstname = t1.firstname AND t1.lastname = t2.lastname AND t1.id > t2.id))
WHERE t2.id IS NULL;
Sonuç
| id | firstname | lastname |
|----|-----------|----------|
| 1 | John | Doe |
| 2 | Bugs | Bunny |
Sıralı Alt Sorgu
DÜZENLE
Sıralı bir alt sorgu kullanarak orijinal yanıtım , değişikliklerden dolayı artık geçerli olmayan MySQL 5.7.5'ten önce yazılmıştır ONLY_FULL_GROUP_BY
. Lütfen bunun yerine yukarıdaki hariç tutma birleşim örneklerini kullanın.
Ayrıca not etmek önemlidir; zaman ONLY_FULL_GROUP_BY
devre dışı (MySQL 5.7.5 önce orijinal davranışı) kullanımı GROUP BY
MySQL seçmek için serbest olduğu için bir toplama işlevi olmadan beklenmedik sonuçlar doğurabilir BİR gruplandırılmasına veri kümesi içindeki değeri [sic] .
Alınan satırla ilişkili olmayan bir anlam ID
veya lastname
değer alınabilir .firstname
UYARI
MySQL GROUP BY
ile birlikte kullanıldığında beklenen sonuçları vermeyebilirORDER BY
Test Örneği Örneğine Bakın
Beklenen sonuçları sağlamak için en iyi uygulama yöntemi, sonuç kümesi kapsamını sıralı bir alt sorgu kullanarak filtrelemektir.
tablo_adı verileri
(1, 'John', 'Doe'),
(2, 'Bugs', 'Bunny'),
(3, 'John', 'Johnson')
Sorgu
SELECT * FROM (
SELECT * FROM table_name ORDER BY ID DESC
) AS t1
GROUP BY FirstName
Sonuç
| ID | first | last |
|----|-------|---------|
| 2 | Bugs | Bunny |
| 3 | John | Johnson |
karşılaştırma
GROUP BY
İle birlikte kullanırken beklenmedik sonuçları göstermek içinORDER BY
Sorgu
SELECT * FROM table_name GROUP BY FirstName ORDER BY ID DESC
Sonuç
| ID | first | last |
|----|-------|-------|
| 2 | Bugs | Bunny |
| 1 | John | Doe |