2015-04-17 53 views
0

我有一種情況。我有兩個表vehiclesjob。我需要的是沒有工作的車輛清單。意味着我需要vehicles其中車輛ID不在job中。比較兩個mysql查詢的結果,並在一個查詢中得到結果

我想:

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 

但這並不返回任何記錄即使有車輛不工作。

任何幫助表示讚賞。謝謝。

UPDATE:

如果任何人有在那裏你可以檢查相應的結果是否在其他表中找到並排除基於一個條件,結果的例子。

+0

爲什麼你有'WHERE v.uid ='?更好地提供一些樣本數據和預期產出。 –

+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

+0

感謝您的回答。我在上面嘗試過,但不管結果如何,都沒有結果。 – Mehulkumar

+0

然後我有你的架構錯誤 - 請參閱:http://sqlfiddle.com/#!9/f6ea4/10上述查詢的示例,以及我如何認爲您的數據是 –

+0

最後它的工作!我只需根據自己的需要正確模製它。因爲你的小提琴的工作,所以它必須爲我工作! – Mehulkumar

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值沒有時間分量。如果這是真的,邏輯只是稍有不同。

0

我覺得您的查詢應該是這樣的

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

這個查詢將給所有車輛那些沒有工作。你可以把其他條件對內部查詢

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 
相關問題