เป็นไปได้หรือไม่ที่ GROUP BY หลายคอลัมน์ใช้ MySQL


206

เป็นไปได้GROUP BYมากกว่าหนึ่งคอลัมน์ในSELECTแบบสอบถามMySQL หรือไม่ ตัวอย่างเช่น:

GROUP BY fV.tier_id AND 'f.form_template_id'

3
คุณไม่สามารถจัดกลุ่มตามแถว คุณสามารถจัดกลุ่มตามคอลัมน์ว่า
Joe Phillips

รุ่นของไวยากรณ์นี้คืออะไร: stackoverflow.com/questions/2421388/…
Ciro Santilli 法轮功冠状病病六四事件法轮功

1
คุณอาจต้องทำแบบสอบถามย่อยแทนการใช้หลายกลุ่มโดยข้อ
Adam F

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

คำตอบ:



107

ใช่คุณสามารถจัดกลุ่มได้หลายคอลัมน์ ตัวอย่างเช่น,

SELECT * FROM table
GROUP BY col1, col2

ผลลัพธ์จะถูกจัดกลุ่มตาม col1 ก่อนแล้วตามด้วย col2 ใน MySQL การตั้งค่าคอลัมน์จะเริ่มจากซ้ายไปขวา


5
การตั้งค่าของซ้ายไปขวาจะถูกนำไปใช้กับลำดับของการจัดกลุ่มและไม่ใช่การตั้งค่ากลุ่มคอลัมน์ มีผลบังคับใช้GROUP BY col1+col2เช่นcol1 = 1, 2, 1, 2 | col2 = 1, 2, 3, 2และวิ่งGROUP BY col1,col2จะกลับมา1,1|1,3|2,2เมื่อเทียบกับ1,1|2,2ที่แนะนำ ในขณะที่GROUP BY col2, col1จะเปลี่ยนลำดับของ col2 ที่กลับมา 1,1|2,2|1,3 การสาธิต: sqlfiddle.com/#!9/d5f69/1โปรดทราบว่า id ของแถว: 2 จะถูกส่งคืนทั้งสองกรณี2,2แม้ว่าจะเป็นการกลับคอลัมน์
fyrye

อีกหนึ่งการทดสอบ sqlfiddle.com/#!9/5c8763/2บทสรุป ที่ mysql แรกเรียงลำดับตามคอลัมน์แรกที่กำหนด (พร้อมGROUP BY) และหากในคอลัมน์แรกที่กำหนดมีผลลัพธ์เท่ากันจะมีเฉพาะผลลัพธ์ที่เท่ากันเรียงตามคอลัมน์ที่สองที่กำหนดไว้
user2360831

เกี่ยวกับการใช้งานกับSUM GROUP BYหากGROUP BYเพียงหนึ่งคอลัมน์แล้วSUMs ค่าทั้งหมดของแต่ละที่แตกต่างกัน (แตกต่างกัน) คอลัมน์ค่าsqlfiddle.com/#!9/1cbde2/2 ถ้าGROUP BYสองคอลัมน์ จากนั้น mysql ในตอนแรกจะตรวจสอบว่าค่าในคอลัมน์แรกมีค่าต่างกันในคอลัมน์ที่สองหรือไม่ ถ้าใช่แล้ว mysql SUMแต่ละค่าที่แตกต่างกันของคอลัมน์ที่สองsqlfiddle.com/#!9/1cbde2/1
user2360831

23

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

ในตัวอย่างของคุณคุณจะเขียน

GROUP BY fV.tier_id, f.form_template_id

ในขณะเดียวกันรหัส

GROUP BY f.form_template_id, fV.tier_id

จะให้ผลลัพธ์ที่คล้ายกัน แต่จัดเรียงแตกต่างกัน



13

ในการใช้ตัวอย่างง่ายๆฉันมีตัวนับที่จำเป็นต้องสรุปที่อยู่ IP ที่ไม่ซ้ำกันต่อการเยี่ยมชมหน้าหนึ่งในเว็บไซต์ ซึ่งโดยทั่วไปแล้วจะจัดกลุ่มตามชื่อไฟล์แล้วโดย IP ฉันแก้ไขมันด้วยการรวมกันของ DISTINCT และ GROUP BY

SELECT pagename, COUNT(DISTINCT ipaddress) AS visit_count FROM log_visitors GROUP BY pagename ORDER BY visit_count DESC;

2
คำตอบนี้น่าสังเกตเพราะมันแก้ปัญหาที่แตกต่างไปจากคำตอบอื่น ๆ
ToolmakerSteve

5

หากคุณต้องการกลุ่ม (ฉันจำเป็นต้องใช้สิ่งนี้) สองคอลัมน์ในเวลาเดียวกันฉันเพิ่งเห็นจุดนี้:

SELECT CONCAT (col1, '_', col2) AS Group1 ... GROUP BY Group1

1
ดูความคิดเห็นของ ypercube ภายใต้คำตอบของ lada พิจารณาเป็นทางเลือก: SELECT CONCAT(col1, '_', col2) FROM GROUP BY col1, col2. ผลลัพธ์มักจะดูเหมือนกับคำตอบนี้ แต่การดำเนินการภายในแตกต่างกันมาก
ToolmakerSteve

-2
GROUP BY CONCAT(col1, '_', col2)

37
ฉันสงสัยว่าคำตอบที่มีเพียงหนึ่งบรรทัดของรหัสโพสต์ 4 ปีหลังจากคำถามที่ได้รับคำตอบได้รับ upvotes 8 (แปด!) ในขณะที่ยังไม่ถูกต้องและไม่มีประสิทธิภาพนอกเหนือจากปลายและระยะสั้น
ypercubeᵀᴹ

8
@ ypercubeᵀᴹทำไมคุณถึงพูดว่ามันไม่ถูกต้อง? นี่คือสิ่งที่ฉันกำลังมองหาและการตีความที่ถูกต้องของ "กลุ่มโดยหลายคอลัมน์" ในความเป็นจริงฉันไม่รู้ว่าทำไมสิ่งนี้จึงไม่ใช่พฤติกรรมของ "กลุ่มโดย col1, col2" อย่างที่ฉันคาดไว้
Abram

3
@AAMAM ส่ง Ping ให้คุณดังนั้นคุณจะเห็นคำตอบของฉันที่มีต่อ NeverEndingQueue ข้อเสีย: มันน้อย - มากน้อย - GROUP BY col1, col2มีประสิทธิภาพกว่า มันจะให้ผลที่ไม่ถูกต้องกับข้อมูลบางอย่าง พูดว่าcol1, col2มีค่า: ('a_b', 'c')ในแถวหนึ่งและ('a', 'b_c')อีกแถว คำตอบที่ผิดนี้โดย GROUP BY CONCAT จะรวมสองแถวในหนึ่งเดียว คำตอบที่ถูกต้องจะไม่
ypercubeᵀᴹ

1
ไม่มีใครหยุดคุณจากการใช้นิพจน์ CONCAT ในรายการ SELECT ได้ถ้าคุณต้องการ:SELECT CONCAT(col1, '_', col2) ... FROM ... GROUP BY col1, col2 ;
ypercubeᵀᴹ

1
@ ypercubeᵀᴹโอ๊ะอย่างโง่เขลาฉันคิดว่า "กลุ่มโดย foo, bar" ประพฤติเหมือน "... จัดกลุ่มโดย foo union ... จัดกลุ่มตามบาร์" มันจะเป็นกรณีที่ผิดปกติแน่นอนตาม GROUP BY CONCAT
Abram
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.