2014-02-07 92 views
0

我有兩個表。一個是engine4_users,另一個是engine4_user_fields_valuesengine4_users表包含id, email, password,displayname。它與engine4_user_fields_values表有關係one to many。該engine4_user_fields_values表看起來像Mysql加入多個case語句where條款

enter image description here

哪裏item_id是用戶表的user_id。現在你可以看到,在這個表中,field_id對於一個item id也可以有很多值。

現在我想從這兩個表的這樣一種方式,有些時候我需要value列的值,有時我需要把在條件基礎上FIELD_ID value列中選擇數據。 例如見我的查詢

SELECT 
`eu`.`user_id`, `eu`.`displayname`, 
GROUP_CONCAT(
        CASE WHEN eufv.field_id = 19 THEN eufv.value END 
       ) AS city, 
    GROUP_CONCAT(
     CASE WHEN eufv.field_id = 15 THEN eufv.value END 
     )AS interests 

FROM 
    `engine4_users` AS `eu` 
    INNER JOIN 
    `engine4_user_fields_values` AS `eufv` 
    ON 
    eu.user_id = eufv.item_id 
    WHERE 
    (eu.username LIKE '%hameed%' OR eu.email LIKE '%hameed%' OR eu.displayname LIKE '%hameed%') 
    GROUP BY 
`eu`.`user_id`; 

該查詢由用戶獲得的數據組,作爲逗號分隔得到FIELD_ID 15的16個值。現在我想在第二張表的更多條件下過濾出結果。

比如我希望把條件對FIELD_ID 6這是生日的人的年齡是在一定範圍內,並FIELD_ID 5到值爲3。但是當我把下面的查詢

SELECT 
`eu`.`user_id`, `eu`.`displayname`, 

GROUP_CONCAT(
        CASE WHEN eufv.field_id = 19 THEN eufv.value END 
       ) AS city, 
    GROUP_CONCAT(
     CASE WHEN eufv.field_id = 15 THEN eufv.value END 
     )AS interests 
    FROM 
    `engine4_users` AS `eu` 
    INNER JOIN 
    `engine4_user_fields_values` AS `eufv` 
    ON 
    eu.user_id = eufv.item_id 
    WHERE 
    (eu.username LIKE '%hameed%' OR eu.email LIKE '%hameed%' OR eu.displayname LIKE '%hameed%') 
    AND 
    (FLOOR(DATEDIFF(CURDATE(),CASE WHEN eufv.field_id = 6 THEN eufv.`value` END)/365) >= '20') 
    AND 
    (FLOOR(DATEDIFF(CURDATE(),CASE WHEN eufv.field_id = 6 THEN eufv.`value` END)/365) <= '29') 
    GROUP BY 
`eu`.`user_id`; 

這查詢給出結果,但在這種情況下,我沒有得到列城市和興趣的價值。結果集中它們是空的。如果我把一個條件在where子句是

AND ((CASE WHEN eufv.field_id = 5 THEN eufv.`value` END) = '3') 

這是很好的,並與記錄映射。但在這種情況下,結果集是空的。

我試圖儘可能地解釋我的問題。所以請指導我如何寫這個查詢,或者讓我知道如果我無法傳達我的問題。

問候

回答

0

首先:您正在使用CASE WHEN沒有別的。因此,例如下面的條件是所有假eufv.field_id <> 6,因爲> = 20

(FLOOR(DATEDIFF(CURDATE(),CASE WHEN eufv.field_id = 6 THEN eufv.`value` END)/365) >= '20') 
AND 

其次,CASE計算爲NULL這是不是:當然,你縮小標準時,你會得到較少的記錄。也許你會喜歡所有engine4_users,並且只有在滿足條件時才從engine4_user_fields_values添加數據?這將是一個外部聯接:

FROM `engine4_users` AS `eu` 
LEFT JOIN `engine4_user_fields_values` AS `eufv` 
ON 
    eu.user_id = eufv.item_id AND 
    (FLOOR(DATEDIFF(CURDATE(),CASE WHEN eufv.field_id = 6 THEN eufv.`value` END)/365) >= '20') 
    ... 
WHERE 
    (eu.username LIKE '%hameed%' OR eu.email LIKE '%hameed%' OR eu.displayname LIKE '%hameed%') 

確保您有ON子句,而不是當外加入WHERE子句中的表ne4_user_fields_values的所有條件。

+0

在我的情況下,將在其他聲明?我不希望所有用戶都通過「Left Join」。我只想要符合標準的用戶。 –

+0

即使按照您的建議使用左連接,我再次將這些列清空 –

+0

在ELSE部分中,您將放置符合條件的值,例如DATE_ADD(CURDATE(),INTERVAL 30 YEAR);或者在室外進行:(eufv.field_id <> 6或FLOOR(DATEDIFF(CURDATE(),eufv.'value')/ 365)> ='20') –