我有一个情况。我有两张表vehicles
和job
。我需要的是没有工作的车辆清单。意味着我需要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
但即使有没有工作的车辆,这也不会返回任何记录。
任何帮助表示赞赏。感谢。
更新:
如果有人有这样的示例,您可以检查其他表中是否有相应的结果,并根据条件排除该结果。
答案 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天内到期。
答案 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