2011-11-16 145 views
8

我有一个MySQL数据库2个表:MySQL的一个表中选择字段不在另一个表

Table 1 : id, galleryname 
Table 2 : galleryid, <many other fields...> 

使用PHP,我需要根据其ID,其中该ID来选择表1中的所有行(galleryid)未出现在表2中

实施例: 表1

1, flowers 
2, water 
3, mountains 
4, winter 

表2

3, ... 

会从表1

1, flowers 
2, water 
4, winter 

返回这些行,我不完全知道如何去这个问题。我非常擅长MySQL的基础知识,但我怀疑这是一个JOIN或一个UNION,它不在我的联盟中。

任何帮助表示赞赏。

回答

19

试试这个:

SELECT * FROM table1 
WHERE id NOT IN 
    (SELECT galleryid FROM table2) 

SELECT * FROM table1 
LEFT JOIN table2 
    ON table1.id = table2.galleryid 
WHERE table2.galleryid IS NULL 
+0

很确定你必须在'()'中包装你的子选择才能使你的'IN'语句正常工作。 –

+1

@AdamWenger:是的,我确定我必须...只是我忘了!感谢您的建议! :) – Marco

7

LEFT JOIN把所有的T1记录,然后过滤掉那些t2.galleryid NULL(T2中没有记录)

SELECT id, galleryname 
FROM table1 AS t1 
LEFT OUTER JOIN table2 AS t2 ON t1.id = t2.galleryid 
WHERE t2.galleryid IS NULL 
+0

很干净的查询与非常明确的评论发生了什么事情。对我来说,这是正确的答案,也是解决手头问题的最好方法,因为在大型表上使用子选择并不是一个好主意 – Shmarkus

2
SELECT * FROM table1 
LEFT JOIN table2 
ON table1.id = table2.galleryid 
WHERE table2.galleryid IS NULL 
1

有人发布了一个答案(然后删除它只给了我两个记录。这里的所有其他人似乎给出了错误,但使用原来的帖子,我做了一个改变,它的工作。

原文:

SELECT * FROM table1 INNER JOIN table2 ON galleries.id = images.galleryid 

(这给了我梦想中的那两个)

添加:

SELECT * FROM table1 INNER JOIN table2 ON galleries.id != images.galleryid 

(这给了我,我需要的东西)

+0

使用!=的内部连接是非常糟糕的做法。首先创建两个表的笛卡尔乘积,然后过滤掉匹配的行。随着每个表中的行数增加,这变得非常低效。 –

相关问题