2017-09-02 16 views
-1

我有一個企業的表格,我想從檢查表中返回帶有最新檢查日期的結果集。現在我有:左參加使用MySQL的企業的最新檢查日期

SELECT business_table.business_name, business_table.address, inspection_table.date 
FROM business_table 
LEFT JOIN inspection_table ON business_table.id = inspection_table.business_id 
WHERE inspection_table.date = (
    SELECT MAX(date) 
    FROM inspection_table) 

問題是我得到的最新檢查日期只有一個結果。我需要所有返回的場所。查詢將需要高效,因爲我有大約60萬個機構和3億個檢查。

+0

請參閱https://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-a-very-simple-sql-query – Strawberry

+0

你的意思是你想每個機構有一個結果? Stack Overflow經常詢問這類問題,您可以在[tag:greatest-n-per-group]標籤下找到許多解決方案。 –

回答

0

啊,你是不是在尋找最新的檢驗日期所有。您正在尋找最新的檢查日期每個商家

在您的解決方案中,您仍在使用無法使用的外連接。不要這樣做。要麼使用外連接並正確使用它,要麼使用內連接,如果你沒有問題的話。

這裏是如何讓每個商家的最新檢查與外連接(所以你也表明企業已經沒有檢查,還):

SELECT 
    b.business_name, 
    b.address, 
    i.date, 
    ... 
FROM business_table b 
LEFT JOIN inspection_table i 
      ON i.business_id = b.id 
      AND (i.business_id, i.date) IN 
      (
      SELECT business_id, MAX(date) 
      FROM inspection_table 
      GROUP BY business_id 
      ); 

同樣的,加入:

SELECT 
    b.business_name, 
    b.address, 
    i.date, 
    ... 
FROM business_table b 
LEFT JOIN 
(
    SELECT business_id, MAX(date) AS date 
    FROM inspection_table 
    GROUP BY business_id 
) latest ON latest.business_id = b.id 
LEFT JOIN inspection_table i 
      ON i.business_id = latest.business_id 
      AND i.date  = latest.date; 
+0

第一個例子超時。第二個例子非常完美!順便說一句,我將如何命令i.date DESC的結果? – MoreScratch

+0

因此,MySQL在第一個查詢時失敗是很典型的。畢竟,這兩個查詢做同樣的事情,所以一個好的優化器會用相同的計劃執行它們。至於訂購查詢結果:只需添加一個'ORDER BY'子句。 –

1

您正在使用外部聯接。當一個業務記錄沒有匹配的檢驗記錄時,則會創建一個空的檢驗記錄,然後加入。因此外連檢查記錄將具有所有列NULL。那麼你有WHERE inspection_table.date = (...)。這將再次解除所有外連接記錄,因爲NULL永遠不會匹配。

使用AND代替,使WHERE條款的條件部分:

SELECT 
    b.business_name, 
    b.address, 
    i.date 
FROM business_table b 
LEFT JOIN inspection_table i 
      ON i.business_id = b.id 
      AND i.date  = (SELECT MAX(date) FROM inspection_table); 
0

我使用結束如下:

SELECT business_table.business_name AS Name, business_table.address AS Address, business_table.city AS City, business_table.state AS Province, inspection_table.rating AS Rating, inspection_table.date AS "Inspected" 
FROM business_table 
LEFT JOIN inspection_table ON business_table.id = inspection_table.business_id 
WHERE inspection_table.date = (
    SELECT MAX(inspection_table.date) 
    FROM inspection_table 
    WHERE business_table.id = inspection_table.business_id) 
ORDER BY inspection_table.date DESC