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

หาค่า ID ที่ไม่ซ้ำและไม่มีชื่อ Chris ใน MySQL ด้วย NOT IN Subquery

ใช้ Subquery ร่วมกับ NOT IN เพื่อหาค่า ID ที่ไม่ปรากฏในเงื่อนไขย่อย (เช่น ID ที่ไม่มีชื่อ Chris)

ตัวอย่างการสร้างตาราง

mysql> create table DemoTable ( 
    Id int, 
    FirstName varchar(100) ); 
Query OK, 0 rows affected (0.69 sec)

เพิ่มข้อมูล (มี Id ซ้ำและชื่อ Chris ซ้ำ)

mysql> insert into DemoTable values(100,'Chris'); 
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable values(100,'Robert'); 
Query OK, 1 row affected (0.48 sec)
mysql> insert into DemoTable values(100,'Mike'); 
Query OK, 1 row affected (0.23 sec)
mysql> insert into DemoTable values(100,'Sam'); 
Query OK, 1 row affected (0.48 sec)
mysql> insert into DemoTable values(101,'David'); 
Query OK, 1 row affected (0.19 sec)
mysql> insert into DemoTable values(101,'Robert'); 
Query OK, 1 row affected (0.44 sec)
mysql> insert into DemoTable values(210,'Chris'); 
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable values(210,'Bob'); 
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable values(210,'Sam'); 
Query OK, 1 row affected (0.17 sec)

แสดงข้อมูลทั้งหมด

mysql> select * from DemoTable;
+------+-----------+
| Id   | FirstName |
+------+-----------+
| 100  | Chris     |
| 100  | Robert    |
| 100  | Mike      |
| 100  | Sam       |
| 101  | David     |
| 101  | Robert    |
| 210  | Chris     |
| 210  | Bob       |
| 210  | Sam       |
+------+-----------+
9 rows in set (0.00 sec)

คำสั่งหา Distinct ID ที่ไม่มีชื่อ Chris

mysql> select distinct Id from DemoTable 
where Id not in (select Id from DemoTable where FirstName = 'Chris');

ผลลัพธ์

+------+
| Id   |
+------+
| 101  |
+------+
1 row in set (0.08 sec)

คำอธิบาย:

  1. Subquery: select Id from DemoTable where FirstName = 'Chris' คืนค่า (100, 210)
  2. Main query: หา Id ที่ ไม่อยู่ใน (100, 210) → ได้แค่ 101
  3. DISTINCT ป้องกัน Id ซ้ำในผลลัพธ์

ข้อควรระวัง: NOT IN จะคืนค่าว่างเปล่าถ้า Subquery มีค่า NULL อยู่หนึ่งค่า ควรใช้ NOT EXISTS แทนเพื่อความปลอดภัย