MySQL ผลลัพธ์เป็นรายการที่คั่นด้วยจุลภาค


129

ฉันต้องการเรียกใช้แบบสอบถามเช่น:

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

แต่ฉันต้องการให้การเลือกย่อยส่งคืนรายการที่คั่นด้วยจุลภาคแทนที่จะเป็นคอลัมน์ข้อมูล เป็นไปได้หรือไม่และถ้าเป็นเช่นนั้นได้อย่างไร

คำตอบ:


250

คุณสามารถใช้GROUP_CONCATเพื่อดำเนินการดังกล่าวได้เช่น

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
นอกจากนี้ทราบอย่างรวดเร็วว่าถ้าคุณกำลังใช้ PHPMyAdmin และต้องการที่จะส่งออกรายการที่คั่นด้วยจุลภาคไปยังเพจการใช้งานGROUP_CONCAT(CAST(s.name AS CHAR))หรืออื่น ๆ มันก็จะกลับมาบางสิ่งบางอย่างในเครือ unuseful [BLOB - 20 Bytes]เช่น
devios1

3
เจตนาเป็นสิ่งที่ดีและ MySQL จะอนุญาตสิ่งนี้ แต่โปรดระวัง (โดยทั่วไป) เมื่อคุณใช้ GROUP BY รายการในรายการเลือกต้องเป็นผลรวมที่ถูกต้องในบริบทของคำสั่ง GROUP BY ในกรณีนี้ p.name ไม่ถูกต้องอย่างเคร่งครัด ฐานข้อมูลใด ๆ ที่เป็นไปตามมาตรฐาน SQL จะถือว่าเป็นข้อผิดพลาด สำหรับกรณีนี้ให้ใช้ MAX (p.name) ในรายการที่เลือกหรือเพิ่ม p.name ในคำสั่ง GROUP BY เนื่องจาก Paul อาจหมายถึง p.id เพื่อแสดงถึงคีย์หลักหรือคีย์เฉพาะการเพิ่ม p.name ลงใน GROUP BY clause จะไม่มีผลต่อผลลัพธ์สุดท้าย
Jon Armstrong - Xgc

โปรดทราบว่าคุณอาจต้องตั้งค่าความยาวสูงสุดสำหรับเซสชันต่อstackoverflow.com/questions/2567000/…
sobelito

ขอบคุณมาก ๆ! คุณช่วยฉันมาก!
André Agostinho

11

แทนที่จะใช้group concat()คุณสามารถใช้เพียงแค่concat()

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

แก้ไขสิ่งนี้ใช้ได้เฉพาะใน mySQL Oracle concat ยอมรับเพียงสองอาร์กิวเมนต์ ใน oracle คุณสามารถใช้บางอย่างเช่น select col1 || ',' || col2 || ',' || col3 เป็น foobar จาก table1; ในเซิร์ฟเวอร์ sql คุณจะใช้ + แทนไปป์


2
สิ่งนี้ไม่ควรใช้ในกรณี GROUP BY ในขณะที่ GROUP_CONCAT () จะเชื่อมต่อเนื้อหาของคอลัมน์เดียว
Aram Paronikyan

6

ตอนนี้เพียงฉันมาข้ามสถานการณ์นี้และพบว่าคุณสมบัติที่น่าสนใจอื่น ๆ GROUP_CONCATอีกมากมายบางรอบ ฉันหวังว่ารายละเอียดเหล่านี้จะทำให้คุณรู้สึกน่าสนใจ

GROUP_CONCAT แบบง่าย

SELECT GROUP_CONCAT(TaskName) 
FROM Tasks;

ผลลัพธ์:

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

GROUP_CONCAT กับ DISTINCT

SELECT GROUP_CONCAT(TaskName) 
FROM Tasks;

ผลลัพธ์:

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

GROUP_CONCAT กับ DISTINCT และ ORDER BY

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

ผลลัพธ์:

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

GROUP_CONCAT กับ DISTINCT และ SEPARATOR

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

ผลลัพธ์:

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

GROUP_CONCAT และการรวมคอลัมน์

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

ผลลัพธ์:

+------------------------------------------------------------------------------------+
| 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 และผลลัพธ์ที่จัดกลุ่ม สมมติว่าต่อไปนี้เป็นผลลัพธ์ก่อนใช้GROUP_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;

ผลลัพธ์:

+------------------------+----------------------------------------------------------------------------+
| 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

ในกรณีของฉันฉันต้องเชื่อมหมายเลขบัญชีทั้งหมดของบุคคลที่หมายเลขโทรศัพท์มือถือไม่ซ้ำกัน ดังนั้นฉันจึงใช้แบบสอบถามต่อไปนี้เพื่อให้บรรลุ

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

ผลการค้นหาอยู่ด้านล่าง:

Accounts
93348001,97530801,93348001,97530801
89663501
62630701
6227895144840002
60070021
60070020
60070019
60070018
60070017
60070016
60070015
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.