ตอนกำลังทำข้อมูลทะเบียนลูกบ้านเพื่อที่จะได้ทำรายชื่อคนที่มีสิทธิที่จะออกเสียงในที่ประชุมนิติของหมู่บ้าน ดูๆ น่าจะไม่ยากแค่เขียน query ง่ายๆ มีเลขที่ห้อง ชื่อเจ้าของ จำนวนพื้นที่ แบบ[code language=”sql” title=”รายชื่อผู้ถือกรรมสิทธิ์รายบุคล”]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[/code]ไม่นานก็ได้รายชื่อออกมาทั้ง 843 รายการ แต่จำได้ว่ามีห้องทั้งหมด 730 ห้องแล้วที่เกินมาคืออัลลัย ไล่ดูผลที่ออกมาบางห้องมีเจ้าของมากกว่า 1 คน เป็นเรื่องแล้วเพราะถึงมีเจ้าของกี่คนแต่จะใช้สิทธิได้แค่ห้องละ 1 เท่านั้น ดังนั้นสมมุติว่าห้องไหนมีเจ้าของ 2 คน (เจอว่าบางห้องมี 3 เจ้าของ) จะต้องเขียนให้แสดงรายชื่อในแถวเดียวกัน เช่น ‘1xx/xx’, ‘คุณ พิชญ์ พันธุ์สนิท, คุณ xxx พันธุ์สนิท, คุณ xxx พันธุ์สนิท’, ‘69.58’ แทนที่จะอยู่คนและแถว คนและ row
ตอนแรกจะเขียนแบบใช้ sub query แต่รู้สึกว่าซับซ้อนเกินไปหน่อย ดีที่ไปเห็น GROUP_CONCAT() ลองเขียนดูง่ายกว่าใช้ซับคิวรี่เยอะ[code language=”sql” title=”รายชื่อผู้ถือกรรมสิทธิ์รายห้อง”]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[/code]ข้อมูลออกมาถูกต้องแล้ว แบบเขียนไม่ยากด้วย ^_^