首页 > 解决方案 > 在第二个表MYSQL中按多行过滤数据

问题描述

我有 2 张桌子。用户和 users_meta。我希望查询返回所有具有 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_concatandconcat并无法获得所需的结果。

这是我当前的查询,它提供了所需的输出,但如果有意义的话,我不会按属性过滤。

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 

感谢您的帮助或为我指明正确的方向

标签: mysqlsql

解决方案


鉴于您的用例,我将使用条件聚合

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子句中添加更多条件来添加更多条件。


推荐阅读