เลือก LIMIT 1 ต่อค่าคอลัมน์หรือไม่


11

ให้บอกว่าฉันมีตารางต่อไปนี้

-----------------------------
| user_id   | comment       |
-----------------------------
| 2         | thats cool    |
| 2         | awesome       |
| 3         | i hate this   |
| 3         | okay          |
| 6         | this is weird |
| 6         | hello?        |
| 6         | what is it    |
| 9         | how are you   |
| 16        | too slow      |
| 16        | yes           |
| 17        | alrighty      |
-----------------------------

คุณจะเลือกหนึ่งแถวได้user_idอย่างไร? ดังนั้นผลลัพธ์ของฉันจะเป็น:

-----------------------------
| user_id   | comment       |
-----------------------------
| 2         | thats cool    |
| 3         | i hate this   |
| 6         | this is weird |
| 9         | how are you   |
| 16        | too slow      |
| 17        | alrighty      |
-----------------------------

เป็นไปได้ด้วยแบบสอบถามที่มีประสิทธิภาพเดียวหรือไม่ หรือเลือกย่อยจำเป็นหรือไม่ เป็นไปได้ไหมที่จะใช้DISTINCTในคอลัมน์เดียว

คำตอบ:


9

นั่นคือสิ่งที่GROUP BYใช้สำหรับ รับหนึ่งแถว (ต่อกลุ่ม) ในกรณีนี้ก็จะแสดงที่แตกต่างกันทุกuser_idค่านิยมและสำหรับส่วนที่เหลือของคอลัมน์ที่คุณสามารถ (ต้อง) ใช้ฟังก์ชันการรวมเช่นMIN(), MAX(), AVG(), SUM()เป็นคุณจะมีมากกว่าหนึ่งค่าต่อกลุ่มและมีเพียงหนึ่งสามารถแสดง

SELECT
    user_id
  , MIN(comment) AS comment  -- it will show the first in alphabetical order  
                             -- you could also use MAX()
FROM
    tableX
GROUP BY
    user_id ;

MySQL อนุญาตให้ใช้วิธีแก้ปัญหานอกรีตต่อไปนี้ซึ่งจะแสดงความคิดเห็นหนึ่ง (มากหรือน้อยสุ่ม) ต่อผู้ใช้:

SELECT
    user_id
  , comment
FROM
    tableX
GROUP BY
    user_id ;

แบบสอบถามล่าสุดนี้จะไม่ทำงาน แต่จะเพิ่มข้อผิดพลาดหากONLY_FULL_GROUP_BYเปิดใช้งานโหมด(เข้มงวดขึ้น) ในที่เพิ่งเปิดตัวรุ่น 5.7 โหมดนี้เป็นค่าเริ่มต้นและฟังก์ชั่นใหม่ที่ANY_VALUE()มีให้ สำหรับรายละเอียดเพิ่มเติมดูที่MySQL การจัดการGROUP BYหน้า สามารถเขียนแบบสอบถามได้ทันที:

SELECT
    user_id
  , ANY_VALUE(comment) AS comment
FROM
    tableX
GROUP BY
    user_id ;

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


มีวิธีอื่นในการระบุแถวที่ถูกดึงสำหรับ user_id หรือไม่? มีวิธีใดบ้างในการระบุ ORDER BY
Jake Wilson

นอกจากนี้MINและMAX?
ypercubeᵀᴹ

1
ถ้าอย่างนั้นมันซับซ้อนมากขึ้น ดูคำถามอื่น ๆ นี้: แบบสอบถาม MySQL - วิธีรับข้อมูลประชากรล่าสุด?
ypercubeᵀᴹ

2
คุณจะพบปัญหาที่คล้ายกันมากมายในไซต์ SO ภายใต้[greatest-n-per-group]แท็ก
ypercubeᵀᴹ

1
@ T.BrianJones คุณหมายถึงในแบบสอบถาม "แหกคอก" ถ้าคุณเพิ่มคอลัมน์อื่น ๆ ทั้งหมดในรายการ SELECT? มันเป็นครั้งแรกพวกเขาอาจไม่ได้มาจากแถวเดียวกัน มันไม่ได้สุ่มอย่างแน่นอน แต่ค่าสามารถมาจากแถวที่ต่างกัน (จากกลุ่มเดียวกัน)
ypercubeᵀᴹ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.