我有两个表all_jobs和jobs_applied。问题是我想从all_jobs表中获取作业列表。目前我有这个查询,但它只给我两个表中的共同记录。
SELECT b.uid
, a.jobtitle
, a.job_id
FROM job_posting a
left
join job_applied b
on a.job_id = b.job_id
Where b.uid != 10 and disable=0 and draft =0
有24条记录。在job_applied表中有2条记录。两个表都有job_id字段。当我执行查询时,我期待23条记录,因为一条记录在两个表中都很常见。但我得到了单曲。
我已经检查了这个问题。 What's the difference between INNER JOIN, LEFT JOIN, RIGHT JOIN and FULL JOIN?但不确定如何在我的情况下使用它。
job_posting
job_id,
title,
skills,
post_date
job_applied
id,
job_id,
uid,
apply_date
我想要实现的目标:我想从job_posting表中获取记录列表,但这些记录不应存在于具有特定uid
的job_applied表中。所以,这意味着我必须在uid
的第一个子句和job_id
的另一个子句中添加两个内容。
我也尝试过以下查询,但它返回0条记录。
SELECT
a.jobtitle
, a.job_id
FROM job_posting a
left
join job_applied b
on a.job_id = b.job_id
Where (b.job_id is null and a.disable=0 and a.draft =0 and b.uid !=10)
我现在正在使用此查询,并返回正确的结果。
Select a.jobtitle, a.job_id from job_posting a where
a.job_id not in (select b.job_id from job_applied b WHERE b.uid=1)
AND a.disable=0 AND a.draft =0
如果我做错了,请告诉我。
答案 0 :(得分:3)
在完成所有评论后,我了解到b.uid是对某些用户表的引用。因此job_applied是一种多对多关系的关联表。看来你的查询应该是这样的:
SELECT a.jobtitle, a.job_id
FROM job_posting a
WHERE a.disable=0 AND a.draft =0
AND job_id NOT IN (
SELECT job_id FROM job_applied b
WHERE b.uid = 1)
对于uid = 1的用户,这将从表b中删除匹配的行。这应该通过过程中的某个参数提供。
我准备了一个小提琴供你测试:http://sqlfiddle.com/#!9/91792/7/0 如果有帮助,请告诉我。
答案 1 :(得分:1)
您是否尝试过左外连接?我认为你正在使用的联接只会显示常见的结果。
答案 2 :(得分:1)
job_posting表中的有24条记录。在job_applied表中 是2条记录。两个表都有job_id字段。当我执行查询 我期待23条记录,因为一个记录在两个表中都很常见
我认为job_posting上的左连接应该返回该表上的所有记录(匹配条件),尽管另一个表上的记录与两个或更多相关。由于条件的原因,您可能会在结果中看到23条记录,请检查:
Where b.uid != 10 and disable=0 and draft =0
答案 3 :(得分:0)
当您想从带有循环的查询中获取数据时,您应该尝试这样:
`SELECT a.jobtitle as jTitle, a.job_id as jId
FROM job_posting a
WHERE a.disable=0 AND a.draft =0
AND job_id NOT IN (
SELECT job_id FROM job_applied b
WHERE b.uid = 1)`
喜欢foreach <?=$query['jTitle']?>
答案 4 :(得分:0)
您可以通过这种方式获得相同的结果,但性能更好。
SELECT a.jobtitle, a.job_id
FROM job_posting a
LEFT JOIN job_applied b ON a.job_id=b.job_id
WHERE b.job_id IS NULL and a.disable=0 and a.draft =0 and b.uid=1;