2015-11-29 248 views
0

有我的两个表:INNER JOIN在MySQL

表名:FRIENDS

+-------+---------+---------+-------------------+ 
| id | firstName | lastName | city  | 
+-------+--------------+------------+-----------+ 
| 1  | dudi   | edri  | london | 
| 2  | maor   | azulay  | madrid | 
| 3  | batel  | azulay  | tel aviv | 
| 4  | nir   | cohen  | barcelona | 
| 5  | evia   | perez  | miami  | 
| 6  | neria  | perez  | new-york | 
| 7  | nevo   | kakoun  | roma  | 
+-------+---------+---------+-------------------+ 

表名:订单

+-------+---------+---------+-----------------+ 
| id | firstName | amount | status | 
+-------+--------------+----------+-----------+ 
| 1  | dudi   | 5684  | shipped | 
| 2  | maor   | 4896  | shipped | 
| 3  | batel  | 2496  | delay  | 
+-------+--------------+----------+-----------+ 

我的问题是: 我想没有订单的朋友。 答案:

| 4  | nir   | cohen  | barcelona | 
| 5  | evia   | perez  | miami  | 
| 6  | neria  | perez  | new-york | 
| 7  | nevo   | kakoun  | roma  | 
+-------+---------+---------+-------------------+ 

我怎么写的查询与内部联接。 谢谢。

+1

你不应该在'ORDERS'为外键使用您的名字。没有任何意义 – lad2025

+0

是 - 外键应该引用主键 – Strawberry

+0

要做内连接的列是:id –

回答

3

您不应该在ORDERS中使用firstName作为外键。外键应引用主键。使用LEFT OUTER JOIN订单

+-------+---------+---------+-----------------+ 
| id | friendID | amount | status | 
+-------+--------------+----------+-----------+ 
| 1  | 1   | 5684  | shipped | 
| 2  | 2   | 4896  | shipped | 
| 3  | 3   | 2496  | delay  | 
+-------+--------------+----------+-----------+ 

和查询:使用IDFRIENDS,如:

表名

SELECT f.* 
FROM FRIENDS f 
LEFT JOIN ORDERS o 
    ON f.ID = o.friendID 
WHERE o.ID IS NULL; 

LiveDemo

另一种可能性是使用correlated subquery

SELECT f.* 
FROM FRIENDS f 
WHERE NOT EXISTS (SELECT 1 
        FROM orders o 
        WHERE o.friendID = f.ID); 

LiveDemo2


表:

CREATE TABLE friends(
    id  INTEGER NOT NULL PRIMARY KEY  -- you can add AUTO_INCREMENT if needed 
    ... 
); 

CREATE TABLE orders(
    id  INTEGER NOT NULL PRIMARY KEY  
    ,friendID INTEGER NOT NULL 
    ,FOREIGN KEY (friendID) REFERENCES friends(id) 
    ... 
);