mysql - 在第二个表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_concat
andconcat
并无法获得所需的结果。
这是我当前的查询,它提供了所需的输出,但如果有意义的话,我不会按属性过滤。
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
感谢您的帮助或为我指明正确的方向
解决方案
鉴于您的用例,我将使用条件聚合:
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
子句中添加更多条件来添加更多条件。
推荐阅读
- widget - 如何保持显示最新以监控 tk 小部件的选项值
- youtube-api - 使用 YouTube Data API (v3) 通过 API 密钥更新视频时出现 401 错误
- typescript - TypeORM:SyntaxError:创建迁移时无法在模块外部使用导入语句
- java - 在使用 LinkedBlockingQueue 和 SynchronousQueue 的任务执行器之间进行选择
- python - Tkinter 画布 - 时间和隐藏图像
- python - 如何删除字符串中的所有连续字符并打印剩余的字符串?
- html - 如何修复 HTML 验证错误 - 在 AMP 网站上
- javascript - 用户单击 JavaScript 中的浏览器后退按钮后如何将用户重定向到另一个页面
- stm32 - 在未知数量的文件中查找最新文件的程序
- django - Django 中的自定义模型字段 | 同时使用 integerchoice 和 textarea