2016-12-29 36 views
0

我有兩個表MYSQL聯接不選擇正確的行

1)推廣

id profile_id url 
------------------------- 
1 2  www.test.com 
2 3  www.google.com 
3 4  www.example.com 

2)。 outreach_links

id outreach_id end_date    status 
------------------------------------ 
1 1   2016-12-28 00:00:00 Approved 
2 1   2016-12-16 00:00:00 Approved 
3 1   NUll     Pending 
4 1   2016-12-11 00:00:00 Approved 

我有這樣的SQL查詢與左連接和除我要選擇符合條件3的MAX END_DATE的整排被工作正常條件。所以在這種情況下,第一行與END_DATE = 2016年12月28日00:00:00

select o.*,ol.*,MAX(ol.end_date) as max_date, SUM(ol.status = "Approved" and (ol.end_date > Now() or end_date is null)) as cond1, SUM(ol.status = "Pending") as cond2, 
    SUM(ol.status = "Approved" and (ol.end_date < Now() and ol.end_date is not null)) as cond3 
FROM outreach o 
LEFT JOIN outreach_links ol on ol.outreach_id = o.id 
WHERE o.profile_id=2 
GROUP BY o.id 
HAVING (cond1 = 0 and cond2 = 0) or (cond1 = 0 and (cond2 = 1 and cond3 >=1)) 
ORDER BY ol.end_date desc 

但是這是此查詢的輸出(其拾取未決出於某種原因)>>

+"id": "3" 
+"profile_id": "2" 
+"url": "www.test.com" 
+"outreach_id": "1" 
+"end_date": null 
+"status": "Pending" 
+"max_date": "2016-12-28 00:00:00" 
+"cond1": "0" 
+"cond2": "1" 
+"cond3": "3" 

我想這不是

+"id": "1" 
+"profile_id": "2" 
+"url": "www.test.com" 
+"outreach_id": "1" 
+"end_date": 2016-12-28 00:00:00 
+"status": "Approved" 
+"max_date": "2016-12-28 00:00:00" 
+"cond1": "0" 
+"cond2": "1" 
+"cond3": "3" 

第一行與MAX的最後一天,我該怎麼做,保持此相同的查詢?

感謝

+0

僅供參考,布爾表達式隱含地評估爲1和0,所以你不需要'IF'。 – shmosel

+0

我在做Sum,因爲可能有多個 – user3150060

+0

我沒有提到SUM。 – shmosel

回答

1

SQL Select only rows with Max Value on a Column如何與最大end_date每個outreach_id獲取該行。然後加入該行以獲取最新狀態。

SELECT o.*, ol1.max_date, ol2.status, SUM(ol.status = "Approved" and (ol.end_date > Now() or end_date is null)) as cond1, SUM(ol.status = "Pending") as cond2, 
    SUM(ol.status = "Approved" and (ol.end_date < Now() and ol.end_date is not null)) as cond3 
FROM outreach o 
LEFT JOIN outreach_links AS ol ON ol.outreach_id = o.id 
LEFT JOIN (SELECT outreach_id, MAX(end_date) AS max_date 
      FROM outreach_links 
      GROUP BY outreach_id) AS ol1 ON ol1.outreach_id = o.id 
LEFT JOIN outreach_links ol2 on ol2.outreach_id = o.id AND ol2.end_date = ol1.max_date 
WHERE o.profile_id=2 
GROUP BY o.id 
HAVING (cond1 = 0 and cond2 = 0) or (cond1 = 0 and (cond2 = 1 and cond3 >=1)) 
ORDER BY ol.end_date desc 
+0

在第一行上奇怪的獲取SQL錯誤:檢查對應於您的MySQL服務器版本的手冊,以找到在o。*,ol1.max_date,ol2.status,SUM(ol.status =?和(ol。 end_date>?or ol.end_'at line 1 – user3150060

+0

我不能重現那個錯誤,我懷疑你在'o。*'附近有一個額外的字符 – Barmar

+0

非常感謝你對我完美的工作 – user3150060