mysql - 按 user_id 选择行以及共享该条目的 event_id 的任何行
问题描述
我有一个包含以下格式的表格:
_______________________________
| event_id | user_id | username |
|-------------------------------|
| 30 | 1 | user1 |
| 30 | 2 | user2 |
| 30 | 3 | user3 |
| 31 | 1 | user1 |
| 31 | 4 | user4 |
| 31 | 7 | user5 |
| 32 | 3 | user1 |
| 32 | 4 | user4 |
| 32 | 5 | user5 |
|_______________________________|
我考虑将用户存储为 JSON:
_______________________________________________________
| event_id | users |
|-------------------------------------------------------|
| 30 | [{"user_id": 1, "username": "user1"}, ...] |
| 31 | [{"user_id": 1, "username": "user1"}, ...] |
| 32 | [{"user_id": 5, "username": "user5"}, ...] |
|_______________________________________________________|
但我想在尝试基于 JSON 值查找事件时,这会影响性能。
我希望能够查找出现 a 的任何事件username
,并返回所有具有相同event_id
. 这可以在单个查询中完成(因为我希望最大限度地减少服务器压力),还是应该只做一个嵌套选择?
解决方案
我希望能够查找出现用户名的任何事件,并返回具有相同 event_id 的所有行。
您可以使用exists
和相关的子查询:
select t.*
from mytable t
where exists (
select 1 from mytable t1 where t1.event_id = t.event_id and t1.username = ?
)
出于性能考虑,您需要在(username, event_id)
.
问号代表username
您要查找的内容。
我不建议将您的数据存储为 JSON:这会使查询更加复杂,几乎没有或根本没有附加值(您存储的结构在各行之间是一致的,因此它非常适合表中)。
推荐阅读
- python - TypeError:“系列”对象在尝试获取 dtypes 时不可调用
- ping - 需要添加 If (Test-Connection) cmdlet
- ldap - 要执行此操作,必须在连接上完成成功绑定
- python - 尝试使用 Python 3 解析 XML 文件
- php - 如何使用 Laravel 中的 Auth 方法获取自定义值?
- android - Firebase 消息服务并不总是收到消息
- java - 2D JButton 数组,想要为游戏添加动作监听器
- azure-data-studio - 有没有办法对整个数据库进行源代码控制,而不仅仅是我选择保存到启用 git 的文件夹的脚本?
- swift - SwiftUI HStack 等高
- javascript - 将(来自 postgresql 的日期和时间戳)转换为 javascript 时间