2012-10-30 48 views
2

我有這個表...WHERE橫跨多行條件

-------------------------------------- 
| user_id | status | status_date | 
-------------------------------------- 
| 1 | Current | 2012-08-01 | 
| 1 | Referral | 2012-03-14 | 
| 2 | Referral | 2012-04-23 | 
|   |   |    | 
-------------------------------------- 

我將如何查詢找到一個獨特的user_id誰2012-06-30前有轉診日期和2012年後無論是當前的日期-06-30或根本沒有當前狀態記錄?

數據庫是MySQL。

+0

只是爲了澄清:當你說'推薦日期'時,你的意思是'status_date = whatever'和'status = referral'? – tmesser

+0

'根本沒有當前狀態記錄' - 在那種情況下,您希望如何找到用戶標識? – DaveRlz

+0

是'當前'的狀態是指日期'2012-08-01' – ChrisG

回答

2

您可以使用LEFT這樣做JOIN:

SELECT DISTINCT T.User_ID 
FROM T 
     LEFT JOIN T T2 
      ON t.User_ID = T2.User_ID 
      AND t2.Status = 'Current' 
WHERE T.Status_Date < '20120630' 
AND  T.Status = 'Referral' 
AND  (t2.Status_Date > '20120630' OR t2.Status_date IS NULL) 

或者,使用GROUP BYHAVINGCOUNT(CASE ...)

SELECT t.User_ID 
FROM T 
GROUP BY t.user_ID 
HAVING COUNT(CASE WHEN t.Status = 'Referral' AND t.Status_Date < '20120630' THEN 1 END) > 0 
AND ( COUNT(CASE WHEN t.Status = 'Current' AND t.Status_Date > '20120630' THEN 1 END) > 0 
    OR COUNT(CASE WHEN t.Status = 'Current' THEN 1 ELSE 0 END) = 0 
    ) 

這將取決於你的指標和量數據表現更好,我想大多數情況下它會是前者

1

這應做到:

SELECT DISTINCT user_id 
FROM YourTable T 
WHERE status = 'Referral' 
AND status_date < '2012-06-30' 
AND NOT EXISTS (SELECT user_id FROM YourTable 
       WHERE user_id = T.user_id AND status = 'Current' 
       AND status_date < '2012-06-30') 
+0

裏面不存在使用'status_date <='2012-06-30'' – Aprillion

+0

@deathApril該特定的邊界案例對我而言有點模棱兩可,所以我只選了一個。 Op可以很容易地適應他的需求 – Lamak

+0

我認爲這不符合標準,沒有當前記錄或當前記錄'2012-06-30'不是同義詞,在'2012年前沒有當前記錄 - 06-30「,正如你所查詢的那樣。如果User_ID 1擁有另一個狀態爲「2012-06-30」前的日期的記錄,它將被排除在結果之外,儘管滿足在此日期之後擁有當前記錄的標準。 [示例小提琴演示](http://www.sqlfiddle.com/#!2/1e12f9/4) – GarethD

0

避免做腸子與MySQL進行選擇。 5.5以下的所有版本無法正確優化。使用聯接:

SELECT distinct t1.user_id 
    FROM tablename t1 
    LEFT JOIN tablename t2 on t1.user_id = t2.user_id AND t1.status != t2.status 
    WHERE t1.status = 'Referral' 
     AND t1.status_date '2012-06-30' 
     AND ((t2.status IS NULL) OR 
       (t2.status = 'Current' AND t2.status_date > '2012-06-30')); 
+0

在你的日期缺少引號。它會被解析爲一個減法,併成爲'1976'。另外......在最後一句中,鏈接的「>」是什麼? –

+0

@MarcB好的。 – Ray

+0

這不符合問題。使用示例數據User_Id 2將被排除在結果之外,因爲在您的連接中它將連接到同一行,因此狀態不爲空(它是引用),並且狀態不是「當前」,因此該行被排除。 [在SQL小提琴演示](http://www.sqlfiddle.com/#!2/1e12f9/7); – GarethD