ตอนกำลังทำข้อมูลทะเบียนลูกบ้านเพื่อที่จะได้ทำรายชื่อคนที่มีสิทธิที่จะออกเสียงในที่ประชุมนิติของหมู่บ้าน ดูๆ น่าจะไม่ยากแค่เขียน query ง่ายๆ มีเลขที่ห้อง ชื่อเจ้าของ จำนวนพื้นที่ แบบ
SELECT CONCAT(h.house_no, '/', h.house_no_sub) AS houseNo, CONCAT(p.title, ' ', p.name, ' ', p.surname) AS owner, h.squareMeter FROM v1_house AS h LEFT JOIN v1_house_owner AS ho ON h.house_id = ho.house_id LEFT JOIN v1_peoples AS p ON ho.people_id = p.people_id ORDER BY h.house_id ASC
ไม่นานก็ได้รายชื่อออกมาทั้ง 843 รายการ แต่จำได้ว่ามีห้องทั้งหมด 730 ห้องแล้วที่เกินมาคืออัลลัย ไล่ดูผลที่ออกมาบางห้องมีเจ้าของมากกว่า 1 คน เป็นเรื่องแล้วเพราะถึงมีเจ้าของกี่คนแต่จะใช้สิทธิได้แค่ห้องละ 1 เท่านั้น ดังนั้นสมมุติว่าห้องไหนมีเจ้าของ 2 คน (เจอว่าบางห้องมี 3 เจ้าของ) จะต้องเขียนให้แสดงรายชื่อในแถวเดียวกัน เช่น ‘1xx/xx’, ‘คุณ พิชญ์ พันธุ์สนิท, คุณ xxx พันธุ์สนิท, คุณ xxx พันธุ์สนิท’, ‘69.58’ แทนที่จะอยู่คนและแถว คนและ row
ตอนแรกจะเขียนแบบใช้ sub query แต่รู้สึกว่าซับซ้อนเกินไปหน่อย ดีที่ไปเห็น GROUP_CONCAT() ลองเขียนดูง่ายกว่าใช้ซับคิวรี่เยอะ
SELECT CONCAT(h.house_no, '/', h.house_no_sub) AS houseNo, GROUP_CONCAT(CONCAT(p.title, ' ', p.name, ' ', p.surname), ' ') AS owner, h.squareMeter FROM v1_house AS h LEFT JOIN v1_house_owner AS ho ON h.house_id = ho.house_id LEFT JOIN v1_peoples AS p ON ho.people_id = p.people_id GROUP BY h.house_id ORDER BY h.house_id ASC , ho.people_id ASC
ข้อมูลออกมาถูกต้องแล้ว แบบเขียนไม่ยากด้วย ^_^