2013-07-31 24 views
0

我有2臺在php mysql中使用「CASE WHEN ... THEN」時錯誤查詢值爲空?

c_users(ID, name) 
     1 | peter 
     2 | micheal 

c_user_meta(user_id, meta_key, meta_value) 
       1 | c_user_level | 0  
       1 | last_login | 2013-07-31 14:33:24 
       2 | c_user_level | 1  
       2 | last_login | 2013-07-30 14:33:24 

和查詢得到用戶的最後一次登錄用c_user_level = 0

$sql = " SELECT u.* , 
      max(CASE WHEN m.meta_key = 'c_user_level' THEN m.meta_value END) level, 
      max(CASE WHEN m.meta_key = 'last_login' THEN m.meta_value END) last_login 
     FROM c_users u 
     LEFT JOIN c_usermeta AS m ON m.user_id = u.ID 
     WHERE u.id >0 
      AND (CASE WHEN m.meta_key = 'c_user_level' THEN m.meta_value END) = 0 
      AND (CASE WHEN m.meta_key = 'last_login' THEN m.meta_value END) IS NOT NULL 
     GROUP BY u.id ORDER BY last_login DESC" 

而且結果:

ID | name | level | last_login 
1 | peter| NULL | 2013-07-31 14:33:24 

錯誤爲什麼USER_ID = 1的水平爲NULL,如何解決它?

回答

1

你可能需要跳過你的WHERE條件:

SELECT 
    u.* , 
    max(CASE WHEN m.meta_key = 'c_user_level' THEN m.meta_value END) level, 
    max(CASE WHEN m.meta_key = 'last_login' THEN m.meta_value END) last_login 
FROM 
    c_users u 
    LEFT JOIN c_usermeta AS m ON m.user_id = u.ID 
WHERE u.id >0 
GROUP BY u.id 
ORDER BY last_login DESC 

或(取決於你是什麼後)使用HAVING子句,篩選聚合值:

SELECT 
    u.* , 
    max(CASE WHEN m.meta_key = 'c_user_level' THEN m.meta_value END) level, 
    max(CASE WHEN m.meta_key = 'last_login' THEN m.meta_value END) last_login 
FROM 
    c_users u 
    LEFT JOIN c_usermeta AS m ON m.user_id = u.ID 
WHERE u.id >0 
GROUP BY u.id 
HAVING level=0 AND last_login IS NOT NULL 
ORDER BY last_login DESC 

請看小提琴here

0
Please, provide else part inside of case statement query : 
Format : case 
      when condition_here then 
       true_statemnt 
      else 
       false_statemnt 
      end 
=============================== 
CASE WHEN m.meta_key = 'c_user_level' THEN m.meta_value else 0 END