使用join比较sql查询中的两个表

时间:2015-01-05 20:47:39

标签: php mysql sql database join

我有2张桌子。

表1 =可交付成果(这是一个常数表)
表2 = pass_deliverable

表1包含(主键)deliverable_id,deliverable_title,deliverable_desc,admin_id,flag
表2包含(主键)passed_deliverable_id,deliverable_id,user_id,flag

现在我想要从deliverable_id回复table 1,我的WHERE子句就是,它不会从deliverable_id回显table 1table 2

具体而言,如果deliverable_id已存在table 1,我想比较deliverable_id中的table 2deliverable_id中的table 2当我使用查询时,它不会在table 1中回显。

这就是我现在所拥有的。

SELECT deliverable.deliverable_id, passed_deliverable.passed_deliverable_id, 
       deliverable.deliverable_title, deliverable.deliverable_desc,
       deliverable.adviser_id
FROM deliverable
INNER JOIN passed_deliverable
ON deliverable.deliverable_id=passed_deliverable.deliverable_id
WHERE deliverable.deliverable_id!=passed_deliverable.deliverable_id  

3 个答案:

答案 0 :(得分:3)

您可以使用WHERE NOT EXISTS检查另一个表中是否存在匹配的数据。下面的查询将返回所有未通过的可交付成果。

SELECT 
  deliverable_id, deliverable_title, deliverable_desc, adviser_id
FROM deliverable d
WHERE 
  NOT EXISTS (
      SELECT 'x' 
      FROM passed_deliverable pd 
      WHERE pd.deliverable_id = d.deliverable_id)

答案 1 :(得分:3)

您需要使用左连接来排除pass_deliverable中的行:

SELECT deliverable.deliverable_id,
       deliverable.deliverable_title,
       deliverable.deliverable_desc,
       deliverable.adviser_id
FROM deliverable
LEFT OUTER JOIN passed_deliverable
    ON deliverable.deliverable_id = passed_deliverable.deliverable_id
WHERE passed_deliverable.deliverable_id IS NULL

这会从deliverable获取所有内容,然后尝试将其加入passed_deliverable(如果存在)。所以你可能会在内存中看到这样的东西:

deliverable_id  passeddeliverable.deliverable_id  ... other columnss
1               1
2               NULL
3               3

然后你的WHERE子句排除passeddeliverable没有匹配的行(在我的例子中为id 2),即passed_deliverable.deliverable_id IS NULL

答案 2 :(得分:1)

SELECT deliverable_id
FROM deliverable
WHERE deliverable_id NOT IN (
  SELECT deliverable_id 
  FROM passed_deliverable
)