按用户id和共享该条目的事件id的任何行选择行

z18hc3ub  于 2021-08-09  发布在  Java
关注(0)|答案(4)|浏览(217)

我有一个表格,包括以下格式:

_______________________________
| 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?

6ju8rftf

6ju8rftf1#

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

iih3973s

iih3973s2#

使用以下命令尝试 group_concat ,这是db小提琴。

select
    event_id,
    concat('[', group_concat(concat('{"user_id":', user_id, ', "username":"',username,'"}')), ']') as users   
from yourTable
group by
    event_id

输出:

| event_id | users                                                                                                       |
| -------- | ----------------------------------------------------------------------------------------------------------- |
| 30       | [{"user_id":1, "username":"user1"},{"user_id":2, "username":"user2"},{"user_id":3, "username":"user3"}] |
| 31       | [{"user_id":1, "username":"user1"},{"user_id":4, "username":"user4"},{"user_id":7, "username":"user5"}] |
| 32       | [{"user_id":3, "username":"user1"},{"user_id":4, "username":"user4"},{"user_id":5, "username":"user5"}] |
vwkv1x7d

vwkv1x7d3#

您说查询是用来生成表的。如果是的话,我想你想要这样的东西:

select e.*, u.user_name
from events e join 
     users u
     on e.user_id = u.user_id
where exists (select 1
              from events e2
              where e2.event_id = e.event_id and
                    e2.user_id = :user_id  -- whichever one you want
             );

如果这与您的查询一致,那么 events(event_id, user_id) 有助于提高绩效。

9w11ddsr

9w11ddsr4#

决定只做一个嵌套的select,返回事件\u id;我最初没有这样做,因为我认为需要为node mysql启用multiple statement querys选项,但事实证明并非如此。

相关问题