MYSQL Запрос с использованием HAVING не работает правильно - PullRequest
0 голосов
/ 17 марта 2020
SELECT user_data_fields.user_id, CONCAT(",", GROUP_CONCAT(CONCAT(user_data_fields.field_id, "-",user_data_fields.value)), ",") AS var, survey_answers.question_id, survey_answers.answer 
FROM user_data_fields 
JOIN survey_answers ON survey_answers.user_id = user_data_fields.user_id 
WHERE survey_answers.question_id IN (328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349)
GROUP BY user_data_fields.user_id,survey_answers.question_id 
HAVING 
    var LIKE "%,5-3,%" AND 
    var LIKE "%,4-180801,%" OR 
     var LIKE "%,4-190801,%" OR 
     var LIKE "%,4-310101,%" OR 
     var LIKE "%,4-420501,%" OR 
     var LIKE "%,4-170701,%"

Я хочу выбрать, где var LIKE "%,5-3,%" И одно из других условий теперь работает, но странно, что сначала после AND не возвращаются результаты массива, я имею в виду это условие var LIKE "%,4-180801,%", но другие работают правильно и возвращают Результаты Может кто-нибудь помочь мне, пожалуйста.

Ответы [ 2 ]

1 голос
/ 17 марта 2020

Я подозреваю, что это делает то, что вы хотите:

HAVING
    SUM(udf.field_id = 5 and udf.value = 3) > 0
    AND SUM(
        udf.field = 4 
        AND udf.value in (180801, 190801, 310101, 420501, 170701)
    ) > 0

Где udf - псевдоним для таблицы user_data_fields.field_id.

То есть: вместо попытки фильтрации по результаты функции агрегирования строк, используйте условные SUM() s. Приведенный выше запрос отфильтровывает группы записей на основе значений кортежа (field_id, value):

  • хотя бы одна запись в группе должна иметь кортеж (5, 3)
  • хотя бы один запись в группе должна удовлетворять другому условному выражению
1 голос
/ 17 марта 2020

Попробуйте следующим образом ..

Фильтруйте и затем сгруппируйте.

SELECT 
    user_data_fields.user_id
    ,CONCAT(",", GROUP_CONCAT(field_id_value), ",") AS var
    ,survey_answers.question_id, survey_answers.answer 
FROM 
    (
        SELECT 
            *
            ,CONCAT(user_data_fields.field_id, "-",user_data_fields.value) field_id_value   
        FROM 
            user_data_fields 
        where 
        (
                CONCAT(user_data_fields.field_id, "-",user_data_fields.value) like '%,5-3,%' AND 
                CONCAT(user_data_fields.field_id, "-",user_data_fields.value) like '%,4-180801,%'
                ,...
                ...
        )
    ) u
JOIN 
    (
        select 
            * 
        from 
            survey_answers s 
        WHERE 
            question_id IN (328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349) 
    ) s

ON s.user_id = u.user_id 

GROUP BY u.user_id,s.question_id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...