Php 使用联接比较sql查询中的两个表

Php 使用联接比较sql查询中的两个表,php,mysql,sql,database,join,Php,Mysql,Sql,Database,Join,我有两张桌子 表1=可交付成果(这是一个常数表) 表2=通过的可交付成果 表1包含(主键)可交付成果id、可交付成果标题、可交付成果描述、管理员id、标志 表2包含(主键)传递的可交付项id、可交付项id、用户id和标志 现在我想从表1和我的WHERE子句中回显可交付的id,它不会从表1中回显可交付的id,而表2已经在中了 具体地说,我想比较表1中的可交付的id和表2中的可交付的id,如果可交付的id已经存在于表2中,那么当我使用查询时,它不会在表1中回声 这是我目前的情况 选择可交付成果.de

我有两张桌子

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

表1包含(主键)可交付成果id、可交付成果标题、可交付成果描述、管理员id、标志
表2包含(主键)传递的可交付项id、可交付项id、用户id和标志

现在我想从
表1
和我的
WHERE
子句中回显
可交付的id
,它不会从
表1
中回显
可交付的id
,而
表2已经在
中了

具体地说,我想比较
表1
中的
可交付的id
表2
中的
可交付的id
,如果
可交付的id
已经存在于
表2
中,那么当我使用查询时,它不会在
表1
中回声

这是我目前的情况

选择可交付成果.deliverable\u id,passed\u deliverable.passed\u deliverable\u id,
可交付成果。可交付成果标题,可交付成果。可交付成果说明,
可交付成果。顾问编号
来自可交付成果
内部连接已通过\u可交付内容
关于可交付成果。可交付成果\u id=通过的可交付成果。可交付成果\u id
可交付成果。可交付成果\u id=已通过\u可交付成果。可交付成果\u id

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

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)

您需要使用左联接来排除传递的可交付内容中的行:

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
这将获取
可交付成果
中的所有内容,然后尝试将其连接到
已通过的\u可交付成果
(如果存在)。因此,您可能会在内存中看到如下内容:

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

那么您的WHERE子句排除了
passeddeliverable
中没有匹配项的行(在我的示例id 2中),即
passed\u deliverable.deliverable\u id为NULL

,总之,您希望
deliverable
中的所有行在
passed\u deliverable
中没有en条目?@Rhumborl绝对正确,先生。谢谢你明白我的意思。先生,我可以知道选择“x”是什么意思吗?当然可以。它只是一个常量。它也可以是
1
'foobar'
pd.deliverable\u id
[not]exists
只检查是否有从子选择返回的记录,而不关心返回的实际值。我在这些情况下使用常量“x”,但这只是我遇到的惯例。
SELECT deliverable_id
FROM deliverable
WHERE deliverable_id NOT IN (
  SELECT deliverable_id 
  FROM passed_deliverable
)