我有一个表格,包括以下格式:
_______________________________
| 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值的事件时,这会对性能造成严重影响。
我希望能查到 username
显示,并返回具有相同属性的所有行 event_id
. 这是可以在单个查询中实现的(我希望最小化服务器压力),还是应该只执行嵌套的select?
4条答案
按热度按时间6ju8rftf1#
我希望能够查找出现用户名的任何事件,并返回具有相同事件标识的所有行。
你可以用
exists
以及相关子查询:为了提高性能,您需要一个索引
(username, event_id)
.问号代表
username
你要找的。我不建议将您的数据存储为json:这会使查询更加复杂,因为几乎没有任何附加值(您存储的结构在各行之间是一致的,因此它非常适合于表)。
iih3973s2#
使用以下命令尝试
group_concat
,这是db小提琴。输出:
vwkv1x7d3#
您说查询是用来生成表的。如果是的话,我想你想要这样的东西:
如果这与您的查询一致,那么
events(event_id, user_id)
有助于提高绩效。9w11ddsr4#
决定只做一个嵌套的select,返回事件\u id;我最初没有这样做,因为我认为需要为node mysql启用multiple statement querys选项,但事实证明并非如此。