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

MySQL: ดึงข้อมูลที่ตรงกับเงื่อนไข 3 จาก 4 เงื่อนไข (Partial Match)

การค้นหาข้อมูลที่ตรงกับเงื่อนไขบางส่วน (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)