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

วิธีเลือกแถวที่คอลัมน์ใดคอลัมน์หนึ่งตรงกับค่าใน MySQL

ใช้ OR รวมเงื่อนไขหลายคอลัมน์ ตรงกับค่าเดียวกัน

เมื่อต้องการค้นหาแถวที่ "คอลัมน์ A = X หรือ คอลัมน์ B = X หรือ คอลัมน์ C = X" ใช้ OR เชื่อมเงื่อนไขแต่ละคอลัมน์

ตัวอย่างสร้างตารางและข้อมูล

CREATE TABLE DemoTable (
    Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    FirstName VARCHAR(10),
    LastName VARCHAR(10),
    Age INT,
    CountryName VARCHAR(10)
);

INSERT INTO DemoTable (FirstName, LastName, Age, CountryName) VALUES
('John', 'Smith', 21, 'US'),
('Carol', 'Taylor', 22, 'AUS'),
('David', 'Miller', 19, 'UK');

ข้อมูลในตาราง

+----+-----------+----------+------+-------------+
| Id | FirstName | LastName | Age  | CountryName |
+----+-----------+----------+------+-------------+
| 1  | John      | Smith    | 21   | US          |
| 2  | Carol     | Taylor   | 22   | AUS         |
| 3  | David     | Miller   | 19   | UK          |
+----+-----------+----------+------+-------------+

คำสั่งค้นหา: FirstName='Carol' OR Age=22 OR CountryName='AUS'

SELECT * FROM DemoTable 
WHERE FirstName = 'Carol' OR Age = 22 OR CountryName = 'AUS';

ผลลัพธ์ (แถวที่ 2 ตรงทั้ง 3 เงื่อนไข)

+----+-----------+----------+------+-------------+
| Id | FirstName | LastName | Age  | CountryName |
+----+-----------+----------+------+-------------+
| 2  | Carol     | Taylor   | 22   | AUS         |
+----+-----------+----------+------+-------------+

คำอธิบาย: OR ต้องการให้เงื่อนไขใดเงื่อนไขหนึ่งเป็นจริง กรณีนี้แถวที่ 2 ตรงทั้ง 3 ข้อ (Carol, 22, AUS)

ประยุกต์ใช้ IN() กับหลายคอลัมน์ (MySQL 8.0+ Row Constructor):

WHERE (FirstName, Age, CountryName) IN (('Carol', 22, 'AUS'));

⚐ ประสิทธิภาพ: OR ระหว่างคอลัมน์ต่างกัน ทำให้ Index ยากต่อการใช้งาน (Index Merge หรือ Full Scan) หาก Query บ่อย ควรสร้าง Index แยกต่อคอลัมน์ หรือ Fulltext Search หากเป็นข้อความ

ตัวเลือก: ใช้ UNION ALL (อาจใช้ Index ได้ดีกว่า)

SELECT * FROM DemoTable WHERE FirstName = 'Carol'
UNION ALL
SELECT * FROM DemoTable WHERE Age = 22
UNION ALL
SELECT * FROM DemoTable WHERE CountryName = 'AUS';

(อาจได้แถวซ้ำ ต้อง DISTINCT หรือ UNION)