2016-06-21 78 views
0

我有兩個表格:客戶和合同。它們之間的公共密鑰是customer_id。我需要鏈接這兩張表來表示我的虛構業務是否與客戶簽訂合同。根據MAX日期和客戶ID獲取數據

客戶 - >合同表具有一對多的關係,因此客戶可以有記錄的舊合同。我想要最新的。這目前由自動遞增的contract_id處理。

我的查詢應該根據customer_id和該customer_id的最大contract_id獲取合同數據。

我的查詢目前看起來是這樣的:

SELECT * FROM(
    SELECT co.* 
     FROM contracts co 
     LEFT JOIN customers c ON co.customer_id = c.customer_id 
     WHERE co.customer_id ='135') a 
    where a.contract_id = MAX(a.contract_id); 

答案很可能是可笑的明顯,我只是沒有看到它。

+1

如果您喜歡,請考慮遵循以下簡單的兩步操作步驟:1.如果您尚未這樣做,請提供適當的CREATE和INSERT語句(和/或sqlfiddle),以便我們可以更輕鬆地複製問題。 2.如果您尚未這樣做,請提供與步驟1中提供的信息相對應的所需結果集。 – Strawberry

+1

dmcoding,我認爲您已將'LEFT JOIN'倒置。應該是'客戶離開加入合同',這意味着關係是0到很多...不是1到很多。 –

回答

1

由於最近期合約將是一個具有最高a.contract_id,只需ORDER BYLIMIT 1

SELECT * FROM(
    SELECT co.* 
     FROM contracts co 
     LEFT JOIN customers c ON co.customer_id = c.customer_id 
     WHERE co.customer_id ='135') a 
ORDER BY a.contract_id DESC 
LIMIT 1 
+0

這將導致1條記錄,如果您刪除'WHERE',它將不起作用。 – sagi

+0

我錯了,因爲你已經過濾了user_id。這應該工作。但刪除外部'SELECT * FROM' –

+0

@sagi,爲什麼不工作?我一開始讀錯了這個問題。但看起來像OP只想要一個記錄 –

1

您可以使用NOT EXISTS()

SELECT * FROM contracts c 
LEFT JOIN customers co 
ON(co.customer_id = c.customer_id) 
WHERE co.customer_id = '135' 
AND NOT EXISTS(SELECT 1 FROM contracts co2 
       WHERE co2.customer_id = co.customer_id 
        AND co2.contract_id > co.contract_id) 

這將確保它是最新的合同,它對所有客戶都是動態的,您只需刪除WHERE co.customer_id = '135'即可獲得所有結果。

通常,您不能在WHERE子句上使用聚合函數,只能在HAVING()上使用聚合函數,該函數通常會與GROUP BY子句結合使用。