我有兩個表。一個是engine4_users
,另一個是engine4_user_fields_values
。 engine4_users
表包含id, email, password,displayname
。它與engine4_user_fields_values
表有關係one to many
。該engine4_user_fields_values
表看起來像Mysql加入多個case語句where條款
哪裏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')
這是很好的,並與記錄映射。但在這種情況下,結果集是空的。
我試圖儘可能地解釋我的問題。所以請指導我如何寫這個查詢,或者讓我知道如果我無法傳達我的問題。
問候
在我的情況下,將在其他聲明?我不希望所有用戶都通過「Left Join」。我只想要符合標準的用戶。 –
即使按照您的建議使用左連接,我再次將這些列清空 –
在ELSE部分中,您將放置符合條件的值,例如DATE_ADD(CURDATE(),INTERVAL 30 YEAR);或者在室外進行:(eufv.field_id <> 6或FLOOR(DATEDIFF(CURDATE(),eufv.'value')/ 365)> ='20') –