2014-02-07 2 views
0

У меня есть две таблицы. Один - engine4_users, а другой - engine4_user_fields_values. Таблица engine4_users содержит id, email, password,displayname. Он имеет one to many отношение с engine4_user_fields_values стол. Таблица engine4_user_fields_values выглядитMysql присоединяется к нескольким операторам case, где пункт

enter image description here

Где item_id является user_id таблицы пользователей. Теперь, как вы можете видеть, в этой таблице field_id может иметь много значений также для одного элемента id.

Теперь я хочу выбрать данные из обеих этих таблиц таким образом, чтобы несколько раз мне нужно значение столбца value, и иногда мне нужно поставить столбец value, где условие основано на field_id. Для примера см мой запрос

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`; 

Этот запрос дает результат, но в этом случае я не получаю значения столбцов города и интересов. Они пустуют в наборе результатов. И если я поставлю еще одно условие в том месте, где есть

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

который хорош и карта с записью. Но в этом случае набор результатов пуст.

Я попытался объяснить свою проблему настолько, насколько смогу. Поэтому, пожалуйста, направляйте меня, как я могу написать этот запрос или сообщить, если я не могу передать свою проблему.

С наилучшими пожеланиями

ответ

0

Прежде всего: Вы используете случай, когда без ELSE. Так, например, следующее условие ложно для всех eufv.field_id <> 6, потому что дело имеет значение NULL, которое не является> = 20.

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

Во-вторых: конечно, при сужении ваши критерии вы получите меньше записей , Может быть, вам понравятся все 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%') 

Убедитесь, что все условия для таблицы ne4_user_fields_values ​​в предложении ON вместо пункта WHERE, когда внешнее соединение.

+0

Что будет в другом заявлении в моем случае? И я не хочу, чтобы все пользователи были «Left Join». Я хочу, чтобы только пользователи соответствовали критериям. –

+0

Даже используя левое соединение, как вы предложили, я снова получу эти столбцы. –

+0

В части ELSE вы поставили некоторое значение, соответствующее критериям, например DATE_ADD (CURDATE(), INTERVAL 30 YEAR); Или сделайте это за пределами: (eufv.field_id <> 6 ИЛИ FLOOR (DATEDIFF (CURDATE(), eufv.'value')/365)> = '20') –

Смежные вопросы