การค้นหาข้อมูลที่ตรงกับเงื่อนไขบางส่วน (N out of M conditions)
เมื่อต้องการดึงแถวที่ตรงกับจำนวนเงื่อนไขที่กำหนด (เช่น 3 จาก 4 เงื่อนไข) สามารถใช้ CASE statement รวมกับการบวกค่าได้
ไวยากรณ์
SELECT * FROM yourTableName
WHERE (CASE WHEN condition1 THEN 1 ELSE 0 END
+ CASE WHEN condition2 THEN 1 ELSE 0 END
+ CASE WHEN condition3 THEN 1 ELSE 0 END
+ CASE WHEN condition4 THEN 1 ELSE 0 END) >= 3;
ตัวอย่างการใช้งาน
สร้างตารางข้อมูลผู้ใช้:
CREATE TABLE UserInformation (
Id INT NOT NULL AUTO_INCREMENT,
FirstName VARCHAR(20),
LastName VARCHAR(20),
Age INT,
Marks INT,
PRIMARY KEY(Id)
);
เพิ่มข้อมูลทดสอบ:
INSERT INTO UserInformation(FirstName, LastName, Age, Marks) VALUES('John', 'Smith', 22, 89);
INSERT INTO UserInformation(FirstName, LastName, Age, Marks) VALUES('Carol', 'Taylor', 21, 80);
INSERT INTO UserInformation(FirstName, LastName, Age, Marks) VALUES('John', 'Doe', 24, 81);
INSERT INTO UserInformation(FirstName, LastName, Age, Marks) VALUES('David', 'Miller', 29, 99);
INSERT INTO UserInformation(FirstName, LastName, Age, Marks) VALUES('Mitchell', 'Johnson', 22, 65);
ค้นหาแถวที่ตรงกับอย่างน้อย 3 จาก 4 เงื่อนไข:
- FirstName = 'Mitchell'
- LastName = 'Johnson'
- Age = 22
- Marks = 67
SELECT * FROM UserInformation
WHERE (CASE WHEN FirstName = 'Mitchell' THEN 1 ELSE 0 END
+ CASE WHEN LastName = 'Johnson' THEN 1 ELSE 0 END
+ CASE WHEN Age = 22 THEN 1 ELSE 0 END
+ CASE WHEN Marks = 67 THEN 1 ELSE 0 END) >= 3;
ผลลัพธ์ (เฉพาะ Mitchell Johnson อายุ 22 ได้ 3 คะแนน):
+----+-----------+----------+------+-------+
| Id | FirstName | LastName | Age | Marks |
+----+-----------+----------+------+-------+
| 5 | Mitchell | Johnson | 22 | 65 |
+----+-----------+----------+------+-------+
วิธีอื่นที่สั้นกว่า (MySQL 8.0+)
ใช้ TRUE = 1, FALSE = 0 โดยตรง:
SELECT * FROM UserInformation
WHERE (FirstName = 'Mitchell')
+ (LastName = 'Johnson')
+ (Age = 22)
+ (Marks = 67) >= 3;
การประยุกต์ใช้
- ระบบค้นหาขั้นสูง (Advanced Search)
- การจับคู่ข้อมูล (Record Matching / Deduplication)
- ระบบแนะนำ (Recommendation Scoring)