จะใช้ GROUP BY เพื่อเชื่อมสตริงใน MySQL ได้อย่างไร?


351

โดยทั่วไปคำถามคือวิธีการได้รับจากสิ่งนี้:

foo_id foo_name
1 A
1 B
2 C

สำหรับสิ่งนี้:

foo_id foo_name
1 AB
2 C

13
DOWNVOTE มันทำให้เกิดความสับสนจริง ๆ ในการตั้งชื่อสตริงคอลัมน์ให้ชื่อที่ดูเหมือนกับชนิดข้อมูล ดังนั้นคำตอบใด ๆ ก็ได้รับผลกระทบจากสิ่งนั้นเนื่องจากคำตอบดูเหมือนว่าพวกเขากำลังระบุชนิดข้อมูลเมื่อพวกเขากำลังระบุชื่อคอลัมน์
barlop

2
@barlop แก้ไขได้โดยแก้ไขคำถามและคำตอบ
ustun

คำตอบ:


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

http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat

จากลิงค์ด้านบนGROUP_CONCAT: ฟังก์ชั่นนี้จะส่งคืนผลลัพธ์สตริงด้วยค่าที่ไม่ต่อกันที่ไม่ใช่ค่า NULL จากกลุ่ม มันจะส่งกลับค่า NULL หากไม่มีค่าที่ไม่ใช่ค่า NULL


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

รายละเอียดเพิ่มเติมที่นี่

จากลิงค์ด้านบนGROUP_CONCAT: ฟังก์ชั่นนี้จะส่งคืนผลลัพธ์สตริงด้วยค่าที่ไม่ต่อกันที่ไม่ใช่ค่า NULL จากกลุ่ม มันจะส่งกลับค่า NULL หากไม่มีค่าที่ไม่ใช่ค่า NULL


คอลัมน์ผลลัพธ์มีการจำกัด จำนวนอักขระ ดูที่นี่และเอกสาร :)
marlo


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

: - ใน MySQL คุณสามารถรับค่าการรวมกันของนิพจน์ที่ต่อกันได้ หากต้องการกำจัดค่าที่ซ้ำกันให้ใช้ส่วนคำสั่งDISTINCT ในการจัดเรียงค่าในผลลัพธ์ให้ใช้ส่วนคำสั่ง ORDER BY หากต้องการเรียงลำดับแบบย้อนกลับให้เพิ่มคีย์เวิร์ดDESC (มากไปหาน้อย) ลงในชื่อของคอลัมน์ที่คุณเรียงลำดับตามในประโยค ORDER BY ค่าเริ่มต้นคือลำดับขึ้น; อาจมีการระบุอย่างชัดเจนโดยใช้คำหลัก ASC ตัวคั่นเริ่มต้นระหว่างค่าในกลุ่มคือเครื่องหมายจุลภาค (“,”) ในการระบุตัวคั่นอย่างชัดเจนให้ใช้ SEPARATOR ตามด้วยค่าตัวอักษรสตริงที่ควรแทรกระหว่างค่ากลุ่ม เพื่อขจัดคั่นทั้งหมดระบุSEPARATOR ''

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

หรือ

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

15

ผลลัพธ์ถูกปัดเศษเป็นความยาวสูงสุดที่กำหนดโดยตัวแปรระบบ group_concat_max_len ซึ่งมีค่าเริ่มต้นที่ 1024 อักขระดังนั้นก่อนอื่นเราจะ:

SET group_concat_max_len=100000000;

จากนั้นเช่น:

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

ผลที่ได้คือการตัดทอนความยาวสูงสุดที่จะได้รับจากตัวแปรระบบ group_concat_max_len ซึ่งมีค่าเริ่มต้นของ1024ตัวอักษร เอกสาร
marlo

ขอบเขตของการกำหนดค่านี้group_concat_max_lenคืออะไร? การเชื่อมต่อ / เซสชันปัจจุบันหรือจะส่งผลกระทบต่อไคลเอนต์อื่น ๆ
Frozen Flame

@FrozenFlame:> หากไม่มีตัวแก้ไขตลาดหลักทรัพย์จะเปลี่ยนตัวแปรเซสชัน หากตัวแปรไม่มีค่าเซสชันจะเกิดข้อผิดพลาด จากdev.mysql.com/doc/refman/5.7/en/using-system-variables.html
arminrosu

3
นี่ไม่ได้ตอบคำถามของ OP แต่เพียงเพิ่มข้อมูลที่เป็นประโยชน์ นี่ควรเป็นความเห็นไม่ใช่คำตอบ
Sean the Bean

1
ขอขอบคุณสำหรับข้อมูลโค้ดนี้ซึ่งอาจให้ความช่วยเหลือแบบ จำกัด และทันที คำอธิบายที่เหมาะสมมากจะเพิ่มมูลค่าในระยะยาวด้วยการแสดงเหตุผลนี้เป็นทางออกที่ดีในการแก้ไขปัญหาและจะทำให้มันมีประโยชน์มากขึ้นให้กับผู้อ่านในอนาคตกับอื่น ๆ คำถามที่คล้ายกัน โปรดแก้ไขคำตอบของคุณเพื่อเพิ่มคำอธิบายรวมถึงข้อสมมติที่คุณได้ทำไว้
เป็ดโดนัลด์

11

คำตอบที่ดี ฉันยังมีปัญหากับ NULLS และจัดการแก้ไขด้วยการรวม COALESCE ภายใน GROUP_CONCAT ตัวอย่างดังต่อไปนี้:

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

หวังว่านี่จะช่วยคนอื่นได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.