ความยาวสูงสุดของ MySQL และ GROUP_CONCAT ()


260

ฉันใช้GROUP_CONCAT()ในแบบสอบถาม MySQL เพื่อแปลงหลายแถวเป็นสตริงเดียว อย่างไรก็ตามความยาวสูงสุดของผลลัพธ์ของฟังก์ชันนี้คือ1024อักขระ

ฉันตระหนักดีว่าฉันสามารถเปลี่ยนพารามิเตอร์group_concat_max_lenเพื่อเพิ่มขีด จำกัด นี้:

SET SESSION group_concat_max_len = 1000000;

อย่างไรก็ตามบนเซิร์ฟเวอร์ที่ฉันใช้ฉันไม่สามารถเปลี่ยนพารามิเตอร์ได้ ไม่ใช่โดยการใช้คิวรีก่อนหน้าและไม่ใช่โดยการแก้ไขไฟล์คอนฟิกูเรชันใด ๆ

ดังนั้นคำถามของฉันคือ: มีวิธีอื่นในการรับผลลัพธ์ของแบบสอบถามหลายแถวในสตริงเดียวหรือไม่


1
คุณหมายถึงงานอื่นที่ไม่ใช่ลูกค้างานใช่ไหม?
lexu

40
ขอบคุณเพื่อน ... คำถามของคุณคือคำตอบสำหรับคำถามของฉัน :)
Mansoorkhan Cherupuzha

ดูเหมือนว่าคุณจะได้เลือกคำตอบแล้ว แต่จากความอยากรู้อยากเห็นทำไมคุณไม่สามารถใช้SETคำสั่งเพื่อเปลี่ยนตัวแปรเซสชั่น?
Bill Karwin

2
นั่นเป็นเพราะแบบสอบถามที่ฉันต้องสร้างนั้นฝังอยู่ในกรอบ php โฮมเมดที่เน่าเสียและฉันไม่ได้รับอนุญาตให้แก้ไขส่วนอื่น ๆ วิธีที่รหัสโครงการนี้เป็นสิ่งที่น่าอับอายจริงๆ
ZeWaren

1
ผมแปลกใจเมื่อใช้ฟังก์ชั่น group_concat สตริงเป็นผลตอบแทนจากการแบ่งของฉันฉันมีความคิดว่าการทำงานนี้กลับมีจำนวน จำกัด ขอบคุณเพื่อนถ่านคำถามของคุณมีฉันล้าง :)
MasoodUrRehman

คำตอบ:


335
SET SESSION group_concat_max_len = 1000000;

เป็นการตั้งค่าขอบเขตเซสชันชั่วคราว ใช้กับเซสชันปัจจุบันเท่านั้นคุณควรใช้แบบนี้

SET SESSION group_concat_max_len = 1000000;
select group_concat(column) from table group by column

คุณสามารถทำได้แม้ในการแชร์โฮสติ้ง แต่เมื่อคุณใช้เซสชันอื่นคุณจะต้องทำซ้ำSET SESSIONคำสั่ง


4
ฉันต้องการใช้ GLOBAL แทน SESSION: SET GLOBAL group_concat_max_len=6999เพื่อให้การตั้งค่าใช้ได้กับข้อความค้นหา
IcedDante

2
Rackspace และเซิร์ฟเวอร์คลาวด์อื่น ๆ ไม่อนุญาตการเข้าถึงทั่วโลก ฉันลองใช้ jdbc.execute ("SET SESSION group_concat_max_len = ... "); ภายในวิธีการเริ่มต้น Dao แต่เมื่อ keatkeat ระบุไว้นี่เป็นเพียงชั่วคราว ถ้าใครรู้วิธีการที่เหมาะสมเพื่อให้การเปลี่ยนแปลงนี้อย่างถาวรกรุณาแจ้งให้เราทราบ
IcedDante

61

พารามิเตอร์ที่ถูกต้องเพื่อตั้งค่าความยาวสูงสุดคือ:

SET @@group_concat_max_len = value_numeric;

value_numericจะต้อง> 1024; โดยค่าเริ่มต้นgroup_concat_max_lenค่าคือ 1024


3
SET SESSION และ SET GLOBAL ไม่สามารถใช้งานบนเซิร์ฟเวอร์ได้ ขอบคุณ!
mfink

สิ่งนี้ทำงานได้ในขณะที่ข้อเสนอแนะอื่น ๆ ไม่ได้ @ เซิร์ฟเวอร์ MySQL 5.1.41 (ฉันรู้ว่ามันเป็นรุ่นเก่า)
low_rents

2
จริงๆคุณสามารถตั้งค่าgroup_concat_max_lenให้น้อยที่สุดเท่าที่ 4 ( mysql docs ) " value_numericต้องเป็น> = 4" เป็นกรณีนี้ ฉันใช้มันเพื่อทดสอบสิ่งที่เกิดขึ้นเมื่อคุณมีgroup_concat_max_lenค่าเกิน
โทมัส F

1
ฉันสามารถยืนยันได้ว่าพารามิเตอร์นี้ไม่ได้พิสูจน์การรีบูต: เมื่อเริ่ม mysql ใหม่จะได้รับการตั้งค่าใหม่เป็น 1024 ดังนั้น -1 สำหรับฉัน
Frédéric

2
@NoWay คุณต้องตั้งค่าในไฟล์กำหนดค่า (เช่น my.cnf) เพื่อให้การตั้งค่าใช้กับการรีสตาร์ท mysql SETแบบสอบถามจะไม่มีผลต่อการตั้งค่าหลังจากรีสตาร์ท
Buttle Butkus


8

คุณสามารถลองสิ่งนี้

SET GLOBAL group_concat_max_len = 1000000;

ฉันใช้นี่เป็นลูกค้า sqlyog สำหรับ db ของฉัน แต่มันไม่ได้สะท้อน แต่ดูเหมือนว่าจะทำงานเมื่อฉันรันผ่านโปรแกรมจาวาของฉัน
Jerry

5

ไวยากรณ์ที่ถูกต้องคือ mysql> SET @@global.group_concat_max_len = integer;
หากคุณไม่มีสิทธิ์ทำเช่นนี้บนเซิร์ฟเวอร์ที่ฐานข้อมูลของคุณตั้งอยู่ให้ใช้แบบสอบถามเช่น:
mySQL = "SET @@session.group_concat_max_len = 10000;"หรือค่าอื่น
บรรทัดถัดไป:
SET objRS = objConn.Execute(mySQL)  ตัวแปรของคุณอาจแตกต่างกัน
จากนั้น
mySQL="SELECT GROUP_CONCAT(......);"เป็นต้นมา
ฉันใช้เวอร์ชันล่าสุดเนื่องจากฉันไม่มีสิทธิ์เปลี่ยนค่าเริ่มต้นที่ 1024 ทั่วโลก (ใช้ cPanel)
หวังว่านี่จะช่วยได้


2
CREATE TABLE some_table (
  field1 int(11) NOT NULL AUTO_INCREMENT,
  field2 varchar(10) NOT NULL,
  field3 varchar(10) NOT NULL,
  PRIMARY KEY (`field1`)
);

INSERT INTO `some_table` (field1, field2, field3) VALUES
(1, 'text one', 'foo'),
(2, 'text two', 'bar'),
(3, 'text three', 'data'),
(4, 'text four', 'magic');

แบบสอบถามนี้แปลกไปเล็กน้อย แต่ไม่ต้องการแบบสอบถามอื่นเพื่อเริ่มต้นตัวแปร และสามารถฝังในแบบสอบถามที่ซับซ้อนมากขึ้น ส่งคืน 'field2 ทั้งหมดคั่นด้วยเครื่องหมายอัฒภาค

SELECT result
FROM   (SELECT @result := '',
               (SELECT result
                FROM   (SELECT @result := CONCAT_WS(';', @result, field2) AS result,
                               LENGTH(@result)                            AS blength
                        FROM   some_table
                        ORDER  BY blength DESC
                        LIMIT  1) AS sub1) AS result) AS sub2; 

1
นี่เป็นคำตอบที่ดี แต่ไม่ค่อยจบคำถาม - นี่เป็นวิธีที่จะทำให้ concat ยาวมาก แต่จะเกี่ยวกับการจัดกลุ่มอย่างไร ข้อความค้นหาของคุณจะส่งคืนหนึ่งแถวเท่านั้นแทนที่จะเป็นหนึ่งแถวต่อกลุ่ม
Benubird

ฉันจำได้ว่าเป็นสิ่งที่ฉันพยายามทำ - รับผลลัพธ์ทั้งหมดที่กำหนดไว้ในสตริงเดียว
ZeWaren

9
@Benubird นี่เป็นคำถามที่ไม่ดีมาก และไม่ดีฉันหมายถึงแย่มาก OP กำลังทำคิวรีย่อยที่สัมพันธ์กันซึ่งมีคิวรีย่อยที่อยู่ภายในคิวรีย่อย ถ้าคุณต้องตรวจสอบด้วยการเปรียบเทียบข้อมูลคุณจะได้ 256 การเปรียบเทียบกับชุดข้อมูลตัวอย่างของเขาที่รู้จักกันใน 4 แถว .. ตอนนี้ลองนึกภาพถ้าคุณมี 1k แถวนั่นคือการเปรียบเทียบ 1 ล้านล้านครั้ง
John Ruddell

@JohnRuddell ใช่มันเป็น ฉันสามารถมั่นใจได้ว่าคำถามนี้ไม่มีที่ไหนในระบบถ่ายทอดสดที่ร้ายแรง ในเวลานั้นฉันต้องการมันสำหรับความท้าทาย / การออกกำลังกาย
ZeWaren

5
Ah gotcha .. ฉันขอแนะนำให้คุณจดบันทึกสิ่งนั้นไว้ให้ผู้สัญจรคนอื่น ๆ ด้วย ... เนื่องจากคำตอบนี้จะทำให้เข้าใจผิด :) ความพยายามที่น่าสนใจแม้ว่า
John Ruddell
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.