通过第二个表MYSQL

时间:2019-03-17 20:55:32

标签: mysql sql

我有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_concatconcat,但未获得所需的结果。

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

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 个答案:

答案 0 :(得分:1)

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

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上添加更多条件。

答案 1 :(得分:0)

您相当亲密。查询如下所示:

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 ;

不需要聚合,并且如果要按值进行过滤,则比较应该在ONWHEREHAVING子句中。