我正在尝试通过我的数据库查询以接收包含某个user_id作为帖子的所有者或参与者的所有帖子。
我的数据库结构如下:
id: INT
media_id: INT
owner_id: INT
participants: STRING eg. [1,2]
comments: TEXT eg. [{},{}]
以下是两个示例条目:
id: 1, media_id: 2, owner_id: 1, participants: "[1,2]", comments: "[]"
id: 2, media_id: 3, owner_id: 2, participants: "[2,1]", comments: "[]"
我想要实现的是获取ID为1
的用户属于列owner_id
或participants
我当前的查询如下:
SELECT * FROM posts WHERE owner_id = 1 OR participants IN "1"
我收到的结果只是1
是owner_id
我可能理解IN等值错误,但1
是两行中参与者的一部分,因此我应该得到两行作为结果,不应该吗?
答案 0 :(得分:2)
这样可以解决问题:
SELECT * FROM posts WHERE owner_id = 1
OR participants like "%,1]"
OR participants like "[1,%"
OR participants like "%,1,%"
答案 1 :(得分:1)
如果您愿意将participants
字段的数据结构更改为以逗号分隔的值,例如1,2
或2,1
,您可以使用:
SELECT * FROM posts WHERE owner_id = 1 OR FIND_IN_SET(1, participants);
答案 2 :(得分:0)
您可以使用KeyWord Like ...语法示例:
SELECT * FROM posts WHERE owner_id = 1 OR participants Like '%1%'
对于其他情况,您可以使用:
SELECT * FROM posts WHERE owner_id = 1
OR participants like "%,1"
OR participants like "1,%"
OR participants like "%,1,%"
答案 3 :(得分:0)
您应该将查询更改为:
SELECT * FROM posts
WHERE (owner_id = 1 OR participants like "%,1" OR participants like "1,%" OR participants like "%,1,%")
答案 4 :(得分:0)
这确实不是IN
条款的正确方法。它应该看起来像:
SELECT * FROM posts WHERE owner_id = 1 OR participants IN (1)
它只需要寻找多个值(在本例中为id),如:
SELECT * FROM posts WHERE owner_id = 1 OR participants IN (1,5,15)
但是因为你的participants
列是一个字符串,所以它不起作用,因为MySQL不解析/对字符串做一些事情以使其以你尝试的方式使用。
有一种可能且难看的方式来实现您想要的并且不会更改您的数据库结构,但我建议将其更改为更实用的方法,并使用关系表来实现多对多关系?
但实现它的丑陋方式:
SELECT * FROM posts
WHERE owner_id = 1
OR (participants LIKE '[1,%' OR participants LIKE '%,1,%' OR participants LIKE '%,1]')
一个很好的方法是稍微改变你的posts
表:
[posts]
id INT
media_id INT
owner_id INT
comments: TEXT eg. [{},{}]
并添加一个可能的关系表:
[post_participant]
post_id: INT
user_id: INT // -> or named participant_id
通过这种方式,您可以通过以下查询获得正确的帖子:
SELECT p.* FROM posts p
LEFT JOIN post_participant pp ON pp.post_id = p.id AND pp.user_id = p.owner_id
WHERE p.owner_id = 1
OR pp.user_id IS NOT NULL