Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

เลือกแถวที่คอลัมน์เป็น 0 เท่านั้น และ GROUP BY คอลัมน์อื่นใน MySQL

เมื่อต้องการเลือกแถวที่คอลัมน์เฉพาะมีค่า 0 และจัดกลุ่ม (GROUP BY) ตามคอลัมน์อื่น ให้ใช้ WHERE กรองค่า 0 ก่อน แล้วค่อย GROUP BY (หรือใช้ HAVING หากกรองหลัง Group)

ตัวอย่างการใช้งาน

สร้างตารางสถานะสมรส (0=โสด, 1=สมรส):

mysql> create table DemoTable1344 (SequenceId int NOT NULL AUTO_INCREMENT PRIMARY KEY, ClientId int, isMarried tinyint(1));
mysql> insert into DemoTable1344(ClientId,isMarried) values(4567,0),(9876,0),(5432,1),(4567,1),(9873,0);

ข้อมูลทั้งหมด:

+------------+----------+-----------+
| SequenceId | ClientId | isMarried |
+------------+----------+-----------+
| 1          | 4567     | 0         |
| 2          | 9876     | 0         |
| 3          | 5432     | 1         |
| 4          | 4567     | 1         |
| 5          | 9873     | 0         |
+------------+----------+-----------+

คำสั่งเลือกแถวที่ isMarried=0 แล้ว GROUP BY ClientId

mysql> select SequenceId, ClientId, isMarried
    -> from DemoTable1344
    -> group by ClientId
    -> having isMarried=0;

ผลลัพธ์

+------------+----------+-----------+
| SequenceId | ClientId | isMarried |
+------------+----------+-----------+
| 1          | 4567     | 0         |
| 2          | 9876     | 0         |
| 5          | 9873     | 0         |
+------------+----------+-----------+

คำอธิบายและข้อสังเกต:

  • WHERE isMarried=0 กรองแถวก่อน Group (เหลือ ClientId 4567, 9876, 9873)
  • GROUP BY ClientId จัดกลุ่ม ClientId ที่เหลือ (แต่ละกลุ่มมี 1 แถว)
  • HAVING isMarried=0 ในที่นี้ทำงานเหมือน WHERE เพราะแต่ละกลุ่มมีค่า isMarried เดียวกัน
  • ข้อควรระวัง: SELECT SequenceId ขณะ GROUP BY ClientId ไม่ใช่มาตรฐาน SQL (MySQL อนุญาตแต่ค่าอาจไม่แน่นอน) ควรใช้ Aggregate function เช่น MIN(SequenceId) หรือ ANY_VALUE(SequenceId)