加入两个表并获取MySQL中不常见的数据

时间:2016-05-15 18:14:36

标签: mysql

我有两个表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

修改

job_posting表中的

有24条记录。在job_applied表中有2条记录。两个表都有job_id字段。当我执行查询时,我期待23条记录,因为一条记录在两个表中都很常见。但我得到了单曲。

我已经检查了这个问题。 What's the difference between INNER JOIN, LEFT JOIN, RIGHT JOIN and FULL JOIN?但不确定如何在我的情况下使用它。

编辑2(表格结构)

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)

编辑3

我现在正在使用此查询,并返回正确的结果。

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 

如果我做错了,请告诉我。

5 个答案:

答案 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;