MySQL kullanarak birden çok sütuna göre gruplamak mümkün müdür?


208

O mümkün mü GROUP BYMySQL birden fazla sütuna SELECTsorgusu? Örneğin:

GROUP BY fV.tier_id AND 'f.form_template_id'

3
Satırlara göre gruplandıramazsınız. Yine de sütunlara göre gruplayabilirsiniz
Joe Phillips


1
Birden çok yan tümcecik yan tümcesi kullanmak yerine bir alt sorgu yapmanız gerekebilir.
Adam F

Yüksek oylanan cevapların çoğu temelde birbirleriyle aynı olsa da (doğru sözdizimini gösterir ve iki sütunun sırasını değiştirmenin etkisini açıklarlar), eğer ihtiyacınız biraz farklıysa, Daniklad'ın cevabını düşünün .
ToolmakerSteve

Yanıtlar:



108

Evet, birden çok sütuna göre gruplayabilirsiniz. Örneğin,

SELECT * FROM table
GROUP BY col1, col2

Sonuçlar önce col1'e, sonra col2'ye göre gruplandırılacaktır. MySQL'de sütun tercihi soldan sağa gider.


5
Soldan sağa tercih sütun grup tercihine değil, artan gruplama sırasına uygulanır. GROUP BYgeçerlidir col1+col2. örneğin col1 = 1, 2, 1, 2 | col2 = 1, 2, 3, 2ve koşmak önerilenin aksine GROUP BY col1,col2dönecektir . Oysa artan col2 sırasını değiştirirdi. Demo: sqlfiddle.com/#!9/d5f69/1 Sütunların tersine çevrilmesine rağmen her iki durumda da satır kimliği: 2'nin döndürüldüğünü unutmayın . 1,1|1,3|2,21,1|2,2GROUP BY col2, col11,1|2,2|1,32,2
fyrye

Bir test daha. sqlfiddle.com/#!9/5c8763/2 Sonuç. İlk önce mysql ilk tanımlı sütuna (ile GROUP BY) göre sıralar . Ve ilk tanımlı sütunda eşit sonuçlar varsa, o zaman sadece ikinci tanımlı sütuna göre eşit sonuç sıralaması içinde
user2360831 15:19

İle kullanımı SUMile ilgili GROUP BY. Eğer GROUP BYsadece tek sütun ve ardından SUMher bir ayrı (farklı) tüm değerleri sütun değeri s sqlfiddle.com/#!9/1cbde2/2 . EğerGROUP BYİki sütun . Daha sonra ilk önce mysql, ilk sütun değeri için ikinci sütunda farklı değerler olup olmadığını kontrol eder. Evetse, sqlfiddle.com/#!9/1cbde2/1SUM ikinci sütunun her farklı değerini mysql olarak ayarlayın .
user2360831

23

Evet, ancak iki sütuna göre gruplama ne anlama geliyor? Bu, her satırdaki her bir benzersiz çift tarafından gruplandırmayla aynıdır. Sütunları listelediğiniz sıra, satırların sıralanma biçimini değiştirir.

Örneğinizde,

GROUP BY fV.tier_id, f.form_template_id

Bu arada, kod

GROUP BY f.form_template_id, fV.tier_id

benzer sonuçlar verir, ancak farklı şekilde sıralanır.



13

Basit bir örnek kullanmak için, bir sitede ziyaret edilen sayfa başına benzersiz IP adreslerini özetlemek için bir sayacım vardı. Hangi temelde pagename ve sonra IP ile gruplandırma. DISTINCT ve GROUP BY kombinasyonuyla çözdüm.

SELECT pagename, COUNT(DISTINCT ipaddress) AS visit_count FROM log_visitors GROUP BY pagename ORDER BY visit_count DESC;

2
Bu cevap, diğer cevaplardan biraz farklı bir sorunu çözdüğü için kayda değer.
ToolmakerSteve

5

(Bunu uygulamak zorundayım) grubunu aynı anda iki sütun tercih ederseniz, sadece bu noktayı gördüm:

SELECT CONCAT (col1, '_', col2) AS Group1 ... GROUP BY Group1

1
Lada'nın cevabı altındaki ypercube'un yorumlarına bakın. Alternatif olarak düşünün: SELECT CONCAT(col1, '_', col2) FROM GROUP BY col1, col2. Sonuçlar genellikle bu cevapla aynı görünecektir , ancak dahili yürütme oldukça farklıdır.
ToolmakerSteve

-2
GROUP BY CONCAT(col1, '_', col2)

37
Sorunun cevaplanmasından 4 yıl sonra yayınlanan tek bir kod satırı ile bir cevabın 8 (sekiz!) Upvotes aldığını merak ediyorum. Geç ve kısa yanı sıra yanlış ve verimsiz olmakla birlikte.
ypercubeᵀᴹ

8
@ ypercubeᵀᴹ bunun yanlış olduğunu neden söylüyorsun? Tam da aradığım şey bu ve "birden çok sütuna göre grupla" nın doğru bir yorumu. Aslında, bu neden beklediğim gibi "grup by col1, col2" davranışı neden bilmiyorum
Abram

3
@Abram size ping atıyor, bu yüzden NeverEndingQueue'ya cevabımı görüyorsunuz. Dezavantajları: daha az - çok daha az - verimli GROUP BY col1, col2. Bazı verilerle yanlış sonuçlar verecektir. Diyelim col1, col2ki değerler var: ('a_b', 'c')bir satırda ve ('a', 'b_c')diğerinde. GROUP BY CONCAT ile bu yanlış cevap iki satırı bir araya getirecektir. Doğru cevap olmayacak.
ypercubeᵀᴹ

1
Gerekirse hiç kimse bu arada SELECT listesindeki CONCAT ifadesini kullanmanızı SELECT CONCAT(col1, '_', col2) ... FROM ... GROUP BY col1, col2 ;
engellemez

1
@ ypercubeᵀᴹ ayy, aptalca "grup foo, bar" gibi davrandım "... grup foo sendika ... grup bar" diye düşünüyordum. Gerçekten GROUP BY CONCAT için alışılmadık bir durum olurdu.
Abram
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.