2016-04-18 14 views
0

我正在處理一個包含過期日期的項目表,這些項目被分配給用戶。MySql - 從案例中排除默認的最大日期

我想爲每個用戶,最高到期date.The 問題這裏要說的是,如果其他項目存在該用戶的默認項與應忽視的「3000/01/01」有效期初始化。

我有一個查詢這樣做:

 
SELECT 
    user_id as UserId, 
    CASE WHEN (YEAR(MAX(date_expiration)) = 3000) 
     THEN (
      SELECT MAX(temp.date_expiration) 
      FROM user_items temp 
      WHERE YEAR(temp.date_expiration) <> 3000 and temp.user_id = UserId 
     ) 
     ELSE MAX(date_expiration) 
    END as date_expiration 
FROM user_items GROUP BY user_id 

工作,但在查詢的THEN塊查殺性能一點,這是一個巨大的表。

那麼,在輸入CASE條件時,有沒有更好的方法可以忽略來自MAX操作的默認日期?

回答

2
SELECT user_id, 
     COALESCE(
       MAX(CASE WHEN YEAR(date_expiration) = 3000 THEN NULL ELSE date_expiration END), 
       MAX(date_expiration) 
     ) 
FROM user_items 
GROUP BY 
     user_id 

如果有幾個用戶,但很多在你的表每個用戶的條目,可以嘗試提高您的查詢還多了幾分:

SELECT user_id, 
     COALESCE(
     (
     SELECT date_expiration 
     FROM user_items uii 
     WHERE uii.user_id = uid.user_id 
       AND date_expiration < '3000-01-01' 
     ORDER BY 
       user_id DESC, date_expiration DESC 
     LIMIT 1 
     ), 
     (
     SELECT date_expiration 
     FROM user_items uii 
     WHERE uii.user_id = uid.user_id 
     ORDER BY 
       user_id DESC, date_expiration DESC 
     LIMIT 1 
     ) 
     ) 
FROM (
     SELECT DISTINCT 
       user_id 
     FROM user_items 
     ) uid 

你需要(user_id, date_expiration)指數爲這個工作快速。

+0

偉大的perforamance提升! –