Фильтрация данных по нескольким строкам во второй таблице MYSQL - PullRequest
2 голосов
/ 17 марта 2019

У меня есть 2 таблицы.пользователи и пользователи_мета.Я хочу, чтобы запрос возвращал всех пользователей, которые имеют sexe = M и user_att1 = 1 (который должен возвращать только mathew), но мне также нужно иметь возможность фильтровать и по другим атрибутам.

users таблица организована так:

ID  | Firstname | Lastname  | Sexe     etc.
1      Mathew      Perkins     M
2      Andrea      Smith       F
3      Andrew      Story       M

users_meta таблица организована так:

ID  | user_id |  meta_key   | meta_value 
1   | 1       | user_att1   | 1
2   | 1       | user_att2   | 0
3   | 2       | user_att1   | 0
4   | 2       | user_att2   | 1
5   | 3       | user_att1   | 0
6   | 3       | user_att2   | 1

Я пытался использовать group_concat и concat и не смог получить желаемый результат.

Это мой текущий запрос, который дает желаемый результат, но я не фильтрую по атрибуту, если это имеет смысл.

SELECT 
    users.id,users.firstname,
    users.lastname, 
    concat(users_meta.meta_value) as 'user_att1' 
FROM users 
LEFT JOIN users_meta ON users.id=users_meta.user_id 
WHERE users_meta.meta_key='user_att1' 
GROUP BY users.id 
ORDER BY ID DESC 
LIMIT 0, 20 

Спасибо за любую помощь или указали мне в правильном направлении

Ответы [ 2 ]

1 голос
/ 18 марта 2019

Учитывая ваш вариант использования, я бы использовал условное агрегирование :

SELECT u.id, u.firstname, u.lastname
FROM users u
INNER JOIN users_meta um ON um.user_id = u.id 
WHERE u.sexe = 'M'
GROUP BY u.id, u.firstname, u.lastname
HAVING MAX(um.meta_key = 'user_att1' AND um.meta_value = 1) > 0
ORDER BY u.id DESC
LIMIT 0, 20

Приятной особенностью этого метода является то, что вы можете добавить больше критериев для users_meta.meta_key, просто добавив больше условий в предложение HAVING.

0 голосов
/ 18 марта 2019

Вы довольно близко.Запрос будет выглядеть следующим образом:

SELECT u.id, u.firstname, u.lastname, 
       um.meta_value as user_att1
FROM users u JOIN
     users_meta um
     ON u.id = um.user_id AND
        um.meta_key = 'user_att1'  AND
        um.meta_value = '1'
ORDER BY ID DESC 
LIMIT 0, 20 ;

Агрегирование не требуется, и если вы хотите фильтровать по значению, сравнение должно быть в предложениях ON, WHERE или HAVING.

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