首页 > 解决方案 > 按 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. 这可以在单个查询中完成(因为我希望最大限度地减少服务器压力),还是应该只做一个嵌套选择?

标签: mysqlsqlnode.jsjson

解决方案


我希望能够查找出现用户名的任何事件,并返回具有相同 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:这会使查询更加复杂,几乎没有或根本没有附加值(您存储的结构在各行之间是一致的,因此它非常适合表中)。


推荐阅读