Php 使用联接比较sql查询中的两个表
我有两张桌子 表1=可交付成果(这是一个常数表)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
表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
)