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

การค้นหาแถวเฉพาะใน MySQL เมื่อมีค่าซ้ำในคอลัมน์

เมื่อตารางมีข้อมูลซ้ำในคอลัมน์ (เช่น ชื่อพนักงานซ้ำกัน) การค้นหาแถวเฉพาะต้องระบุเงื่อนไขหลายคอลัมน์พร้อมกันด้วย AND เพื่อให้ได้ผลลัพธ์ที่แม่นยำ

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

สร้างตารางพนักงาน:

mysql> CREATE TABLE DemoTable1431 (
    -> EmployeeId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    -> EmployeeName VARCHAR(20),
    -> EmployeeCountryName VARCHAR(20)
    -> );

เพิ่มข้อมูล (มีชื่อ Chris Brown ซ้ำ 2 รายการ ประเทศต่างกัน):

mysql> INSERT INTO DemoTable1431 (EmployeeName, EmployeeCountryName) VALUES ('Adam Smith', 'AUS');
mysql> INSERT INTO DemoTable1431 (EmployeeName, EmployeeCountryName) VALUES ('Chris Brown', 'US');
mysql> INSERT INTO DemoTable1431 (EmployeeName, EmployeeCountryName) VALUES ('John Doe', 'UK');
mysql> INSERT INTO DemoTable1431 (EmployeeName, EmployeeCountryName) VALUES ('Chris Brown', 'AUS');

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

mysql> SELECT * FROM DemoTable1431;
+------------+--------------+---------------------+
| EmployeeId | EmployeeName | EmployeeCountryName |
+------------+--------------+---------------------+
|          1 | Adam Smith   | AUS                 |
|          2 | Chris Brown  | US                  |
|          3 | John Doe     | UK                  |
|          4 | Chris Brown  | AUS                 |
+------------+--------------+---------------------+

ค้นหาเฉพาะ Chris Brown ที่อยู่ใน AUS:

mysql> SELECT * FROM DemoTable1431 
    -> WHERE EmployeeName = 'Chris Brown' AND EmployeeCountryName = 'AUS';

ผลลัพธ์ได้เพียง 1 แถวที่ตรงกับเงื่อนไขทั้งสอง:

+------------+--------------+---------------------+
| EmployeeId | EmployeeName | EmployeeCountryName |
+------------+--------------+---------------------+
|          4 | Chris Brown  | AUS                 |
+------------+--------------+---------------------+

เทคนิคเพิ่มเติมสำหรับข้อมูลซ้ำ

  • DISTINCT: ดึงค่าที่ไม่ซ้ำกัน SELECT DISTINCT EmployeeName FROM DemoTable1431
  • GROUP BY: จัดกลุ่มข้อมูลซ้ำ SELECT EmployeeName, COUNT(*) FROM DemoTable1431 GROUP BY EmployeeName
  • ROW_NUMBER() (MySQL 8.0+): ให้ลำดับแถวในแต่ละกลุ่ม เพื่อเลือกแถวแรก/สุดท้าย
  • LIMIT 1: ดึงแค่แถวแรกที่เจอ (เหมาะสำหรับเช็คว่ามีหรือไม่)

แนวทางปฏิบัติที่ดี

  • ออกแบบตารางให้มี Primary Key หรือ Unique Constraint เพื่อป้องกันข้อมูลซ้ำที่ไม่ต้องการ
  • ใช้ Index บนคอลัมน์ที่ค้นหาบ่อยเพื่อเพิ่มประสิทธิภาพ
  • พิจารณา Normalization แยกตารางประเทศออกมาเป็นตารางอ้างอิง