我有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_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
感谢您的帮助或为我指明正确的方向
答案 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 ;
不需要聚合,并且如果要按值进行过滤,则比较应该在ON
,WHERE
或HAVING
子句中。