У меня есть две таблицы. Один - 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, где пункт
Где 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')
который хорош и карта с записью. Но в этом случае набор результатов пуст.
Я попытался объяснить свою проблему настолько, насколько смогу. Поэтому, пожалуйста, направляйте меня, как я могу написать этот запрос или сообщить, если я не могу передать свою проблему.
С наилучшими пожеланиями
Что будет в другом заявлении в моем случае? И я не хочу, чтобы все пользователи были «Left Join». Я хочу, чтобы только пользователи соответствовали критериям. –
Даже используя левое соединение, как вы предложили, я снова получу эти столбцы. –
В части ELSE вы поставили некоторое значение, соответствующее критериям, например DATE_ADD (CURDATE(), INTERVAL 30 YEAR); Или сделайте это за пределами: (eufv.field_id <> 6 ИЛИ FLOOR (DATEDIFF (CURDATE(), eufv.'value')/365)> = '20') –