比较两个mysql查询的结果,并在一个查询中获得结果

时间:2015-04-17 10:54:10

标签: mysql database

我有一个情况。我有两张表vehiclesjob。我需要的是没有工作的车辆清单。意味着我需要vehicles job中没有车辆ID。

我试过了:

SELECT v.id, v.registration_number
FROM vehicles AS v
LEFT JOIN job j ON j.vid = v.id
WHERE v.uid = ?
AND j.vid <> v.id
AND TO_DAYS(j.home_day2) - TO_DAYS(NOW()) <=11
AND TO_DAYS(j.home_day2) - TO_DAYS(NOW()) >=0
ORDER BY v.id DESC

但即使有没有工作的车辆,这也不会返回任何记录。

任何帮助表示赞赏。感谢。

更新:

如果有人有这样的示例,您可以检查其他表中是否有相应的结果,并根据条件排除该结果。

3 个答案:

答案 0 :(得分:1)

根据你的逻辑,这应该有效。

   select v.id from
      vehicles v
        left join job j
          on v.id = j.vid 
            and home_day2 < now() + interval 11 day
            and home_day2 > now()
      where j.vid is null
    order by v.id desc;

但是,如果我可以猜测你想要什么,而不是你的查询显示的内容,那可能就是这样:

   select v.id
     from vehicles v
        left join jobs j
          on v.id = j.vid 
            and j.home_day2 < now() + interval 11 day   
     where j.vid is null
     order by v.id desc;

这将为您提供所有车辆,无论是否有工作,所有车辆没有当前工作,以及所有车辆在未来11天内到期。

Fiddle Here

答案 1 :(得分:1)

我认为您的查询的主要问题是它不包含jobs。您也没有正确使用left join,因此没有理由使用to_days。 。 。特别是因为这可以防止使用索引。代替:

SELECT v.id, v.registration_number
FROM vehicles v LEFT JOIN
     jobs j
     ON j.vid = v.id AND
        j.home_day2 <= date_add(current_date, interval 11 day) AND
        j.home_day2 > current_date
WHERE v.uid = ? AND
      j.vid IS NULL
ORDER BY v.id DESC

这假设home_day2值没有时间组件。如果这是真的,逻辑只会略有不同。

答案 2 :(得分:0)

我认为你的查询应该是这样的

SELECT * FROM vehicles WHERE vehicle_id NOT IN (SELECT vehicle_id FROM jobs GROUP BY vehicle_id); 

此查询将为所有没有工作的车辆提供服务。您可以在INNER QUERY上添加更多条件

SELECT vehicle_id FROM jobs GROUP BY vehicle_id;

喜欢特定日期之间的工作,如下所示:

SELECT vehicle_id FROM jobs GROUP BY vehicle_id WHERE TO_DAYS(j.home_day2) - TO_DAYS(NOW()) <=11 AND TO_DAYS(j.home_day2) - TO_DAYS(NOW()) >=0