MySQL dizeleri birleştirmek için GROUP BY nasıl kullanılır?


351

Temel olarak soru bundan nasıl elde edileceğidir:

foo_id foo_name
1 A
1 B
2 C

buna:

foo_id foo_name
1 AB
2 C

13
DOWNVOTE, bir sütun dizesine ad vermek gerçekten kafa karıştırıcıdır ve ona veri türüne benzeyen bir ad verir. Bu nedenle, herhangi bir yanıt da bundan etkilenir, çünkü cevaplar bir sütun adı
belirtirken

2
@barlop soru ve cevapları düzenleyerek düzeltildi.
ustun

Yanıtlar:



164
SELECT id, GROUP_CONCAT( string SEPARATOR ' ') FROM table GROUP BY id

Daha fazla ayrıntı burada .

Yukarıdaki bağlantıdan GROUP_CONCAT: Bu işlev, bir gruptan birleştirilen NULL olmayan değerlerle bir dize sonucu döndürür. NULL olmayan değerler yoksa NULL döndürür.


sonuçta ortaya çıkan sütun karakter olarak bir sınıra sahiptir . bkz burada ve dokümanlar :)
Marlo

18
SELECT id, GROUP_CONCAT(CAST(name as CHAR)) FROM table GROUP BY id

Size virgülle ayrılmış bir dize verir


17
SELECT id, GROUP_CONCAT(name SEPARATOR ' ') FROM table GROUP BY id;

: - MySQL'de ifade kombinasyonlarının birleştirilmiş değerlerini alabilirsiniz. Yinelenen değerleri ortadan kaldırmak için DISTINCT yan tümcesini kullanın . Sonuçtaki değerleri sıralamak için ORDER BY deyimini kullanın. İçinde sıralamak için ters ekleyin DESC ORDER BY yan tümcesinde tarafından size ayırırken sütunun adının (azalan) anahtar kelime. Varsayılan değer artan düzendir; bu ASC anahtar sözcüğü kullanılarak açıkça belirtilebilir. Bir gruptaki değerler arasındaki varsayılan ayırıcı virgüldür (“,”). Bir ayırıcıyı açıkça belirtmek için, SEPARATOR ve ardından grup değerleri arasına girilmesi gereken dize hazır değeri kullanın. Ayırıcıyı tamamen ortadan kaldırmak için SEPARATOR'u belirtin '' .

GROUP_CONCAT([DISTINCT] expr [,expr ...]
             [ORDER BY {unsigned_integer | col_name | expr}
                 [ASC | DESC] [,col_name ...]]
             [SEPARATOR str_val])

VEYA

mysql> SELECT student_name,
    ->     GROUP_CONCAT(DISTINCT test_score
    ->               ORDER BY test_score DESC SEPARATOR ' ')
    ->     FROM student
    ->     GROUP BY student_name;

15

Sonuç, varsayılan 1024 karakter değerine sahip group_concat_max_len sistem değişkeni tarafından verilen maksimum uzunluğa kesilir, bu yüzden önce şunu yaparız:

SET group_concat_max_len=100000000;

ve sonra, örneğin:

SELECT pub_id,GROUP_CONCAT(cate_id SEPARATOR ' ') FROM book_mast GROUP BY pub_id

Sonuç sahiptir group_concat_max_len sistem değişkeni tarafından verilen maksimum uzunluğa kesilir varsayılan değeri arasında 1024 karakterden. dokümanlar
marlo

Bu group_concat_max_lenyapılandırmanın kapsamı nedir ? Geçerli bağlantı / oturum mu yoksa diğer istemcileri mi etkiler?
Donmuş Alev

@FrozenFlame:> Herhangi bir değiştirici yoksa, SET oturum değişkenini değiştirir. Değişkenin oturum değeri yoksa bir hata oluşur. Gönderen dev.mysql.com/doc/refman/5.7/en/using-system-variables.html
arminrosu

3
Bu OP'nin sorusuna cevap vermez, sadece yararlı bilgiler ekler. Bu bir yorum olmalı, cevap değil.
Sean the Bean

1
Sınırlı ve anında yardım sağlayabilecek bu kod snippet'i için teşekkür ederiz. Bir Doğru bir açıklama ölçüde bu soruna iyi bir çözüm olmasının nedeni göstererek uzun vadeli değerini artıracak ve diğer benzer sorularla gelecek okuyucularına daha kullanışlı bir hale getirecektir. Yaptığınız varsayımlar dahil bazı açıklamalar eklemek için lütfen yanıtınızı düzenleyin .
Donald Duck

11

Harika cevaplar. Ayrıca NULLS ile ilgili bir sorunum vardı ve GROUP_CONCAT içine bir COALESCE ekleyerek çözmeyi başardım. Aşağıdaki gibi örnek:

SELECT id, GROUP_CONCAT(COALESCE(name,'') SEPARATOR ' ') 
FROM table 
GROUP BY id;

Umarım bu başka birine yardımcı olur

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.