Virgülle ayrılmış liste olarak MySQL Sonuçları


129

Şunun gibi bir sorgu çalıştırmam gerekiyor:

SELECT p.id, p.name, 
       (SELECT name 
          FROM sites s 
         WHERE s.id = p.site_id) AS site_list
  FROM publications p

Ancak, alt seçimin veri sütunu yerine virgülle ayrılmış bir liste döndürmesini istiyorum. Bu mümkün mü ve eğer öyleyse, nasıl?

Yanıtlar:


250

Bunu yapmak için GROUP_CONCAT'ı kullanabilirsiniz , örneğin

SELECT p.id, p.name, GROUP_CONCAT(s.name) AS site_list
FROM sites s
INNER JOIN publications p ON(s.id = p.site_id)
GROUP BY p.id, p.name;

10
Ayrıca, PHPMyAdmin kullanıyorsanız ve sayfaya virgülle ayrılmış bir liste çıkarmak istiyorsanız, kullanın GROUP_CONCAT(CAST(s.name AS CHAR))veya başka türlü tamamen kullanışsız bir şey döndürür [BLOB - 20 Bytes].
devios1

3
Amaç gayet iyi ve MySQL buna izin verecek, ancak (genellikle) GROUP BY kullanımınızda dikkatli olun. Seçim listesindeki öğelerin GROUP BY yan tümcesi bağlamında geçerli toplamalar olması gerekir. Bu durumda, p.name kesinlikle geçerli değildir. SQL standardına uyan herhangi bir veritabanı bunu bir hata olarak değerlendirecektir. Bu durum için, seçim listesinde MAX (p.adı) kullanın veya GROUP BY yan tümcesine p.name ekleyin. Paul muhtemelen birincil veya benzersiz bir anahtarı temsil eden p.id anlamına geldiğinden, GROUP BY yan tümcesine p.name eklemenin nihai sonuç üzerinde hiçbir etkisi olmayacaktır.
Jon Armstrong - Xgc

Eğer başına oturum için maksimum uzunluğu ayarlamak gerekebilir stackoverflow.com/questions/2567000/...
sobelito

Çok teşekkürler! Bana çok yardım ettin!
André Agostinho

11

Kullanmak yerine group concat()sadece kullanabilirsinizconcat()

Select concat(Col1, ',', Col2) as Foo_Bar from Table1;

bunu düzenle yalnızca mySQL'de çalışır; Oracle concat yalnızca iki argüman kabul eder. Oracle'da, table1'den temel çubuk olarak col1 || ',' || col2 || ',' || col3 gibi bir şey kullanabilirsiniz; sql server'da, borular yerine + kullanırsınız.


2
GROUP_CONCAT () tek bir sütunun içeriğini birleştirirken bu GROUP BY durumunda çalışmamalıdır
Aram Paronikyan

6

Şimdi sadece ben bu durumla karşılaştım ve etrafta daha ilginç özellikler buldum GROUP_CONCAT. Umarım bu detaylar sizi ilginç hissettirir.

basit GROUP_CONCAT

SELECT GROUP_CONCAT(TaskName) 
FROM Tasks;

Sonuç:

+------------------------------------------------------------------+
| GROUP_CONCAT(TaskName)                                           |
+------------------------------------------------------------------+
| Do garden,Feed cats,Paint roof,Take dog for walk,Relax,Feed cats |
+------------------------------------------------------------------+

DISTINCT ile GROUP_CONCAT

SELECT GROUP_CONCAT(TaskName) 
FROM Tasks;

Sonuç:

+------------------------------------------------------------------+
| GROUP_CONCAT(TaskName)                                           |
+------------------------------------------------------------------+
| Do garden,Feed cats,Paint roof,Take dog for walk,Relax,Feed cats |
+------------------------------------------------------------------+

DISTINCT ve ORDER BY ile GROUP_CONCAT

SELECT GROUP_CONCAT(DISTINCT TaskName ORDER BY TaskName DESC) 
FROM Tasks;

Sonuç:

+--------------------------------------------------------+
| GROUP_CONCAT(DISTINCT TaskName ORDER BY TaskName DESC) |
+--------------------------------------------------------+
| Take dog for walk,Relax,Paint roof,Feed cats,Do garden |
+--------------------------------------------------------+

DISTINCT ve SEPARATOR ile GROUP_CONCAT

SELECT GROUP_CONCAT(DISTINCT TaskName SEPARATOR ' + ') 
FROM Tasks;

Sonuç:

+----------------------------------------------------------------+
| GROUP_CONCAT(DISTINCT TaskName SEPARATOR ' + ')                |
+----------------------------------------------------------------+
| Do garden + Feed cats + Paint roof + Relax + Take dog for walk |
+----------------------------------------------------------------+

GROUP_CONCAT ve Sütunları Birleştirme

SELECT GROUP_CONCAT(TaskId, ') ', TaskName SEPARATOR ' ') 
FROM Tasks;

Sonuç:

+------------------------------------------------------------------------------------+
| GROUP_CONCAT(TaskId, ') ', TaskName SEPARATOR ' ')                                 |
+------------------------------------------------------------------------------------+
| 1) Do garden 2) Feed cats 3) Paint roof 4) Take dog for walk 5) Relax 6) Feed cats |
+------------------------------------------------------------------------------------+

GROUP_CONCAT ve Gruplanmış Sonuçlar Kullanmadan önce aşağıdakilerin sonuçlar olduğunu varsayınGROUP_CONCAT

+------------------------+--------------------------+
| ArtistName             | AlbumName                |
+------------------------+--------------------------+
| Iron Maiden            | Powerslave               |
| AC/DC                  | Powerage                 |
| Jim Reeves             | Singing Down the Lane    |
| Devin Townsend         | Ziltoid the Omniscient   |
| Devin Townsend         | Casualties of Cool       |
| Devin Townsend         | Epicloud                 |
| Iron Maiden            | Somewhere in Time        |
| Iron Maiden            | Piece of Mind            |
| Iron Maiden            | Killers                  |
| Iron Maiden            | No Prayer for the Dying  |
| The Script             | No Sound Without Silence |
| Buddy Rich             | Big Swing Face           |
| Michael Learns to Rock | Blue Night               |
| Michael Learns to Rock | Eternity                 |
| Michael Learns to Rock | Scandinavia              |
| Tom Jones              | Long Lost Suitcase       |
| Tom Jones              | Praise and Blame         |
| Tom Jones              | Along Came Jones         |
| Allan Holdsworth       | All Night Wrong          |
| Allan Holdsworth       | The Sixteen Men of Tain  |
+------------------------+--------------------------+
USE Music;
SELECT ar.ArtistName,
    GROUP_CONCAT(al.AlbumName)
FROM Artists ar
INNER JOIN Albums al
ON ar.ArtistId = al.ArtistId
GROUP BY ArtistName;

Sonuç:

+------------------------+----------------------------------------------------------------------------+
| ArtistName             | GROUP_CONCAT(al.AlbumName)                                                 |
+------------------------+----------------------------------------------------------------------------+
| AC/DC                  | Powerage                                                                   |
| Allan Holdsworth       | All Night Wrong,The Sixteen Men of Tain                                    |
| Buddy Rich             | Big Swing Face                                                             |
| Devin Townsend         | Epicloud,Ziltoid the Omniscient,Casualties of Cool                         |
| Iron Maiden            | Somewhere in Time,Piece of Mind,Powerslave,Killers,No Prayer for the Dying |
| Jim Reeves             | Singing Down the Lane                                                      |
| Michael Learns to Rock | Eternity,Scandinavia,Blue Night                                            |
| The Script             | No Sound Without Silence                                                   |
| Tom Jones              | Long Lost Suitcase,Praise and Blame,Along Came Jones                       |
+------------------------+----------------------------------------------------------------------------+

3

Benim durumumda, cep telefonu numarası benzersiz olan bir kişinin tüm hesap numarasını birleştirmem gerekiyor. Bu yüzden bunu başarmak için aşağıdaki sorguyu kullandım.

SELECT GROUP_CONCAT(AccountsNo) as Accounts FROM `tblaccounts` GROUP BY MobileNumber

Sorgu Sonucu aşağıdadır:

Accounts
93348001,97530801,93348001,97530801
89663501
62630701
6227895144840002
60070021
60070020
60070019
60070018
60070017
60070016
60070015
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.