![](/img/trans.png)
[英]MySQL SELECT from table where row = (SELECT val1, val2, val3, … etc.)
[英]mySQL WHERE clause with column = val1 OR coumn IN values
我试图通过我的数据库查询接收包含某个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
OR participants
我当前的查询如下所示:
SELECT * FROM posts WHERE owner_id = 1 OR participants IN "1"
我收到的结果只是1
是owner_id
我可能会理解IN等值错误但是1
是两行中参与者的一部分,因此我应该得到两行作为结果,不应该吗?
这样就可以了:
SELECT * FROM posts WHERE owner_id = 1
OR participants like "%,1]"
OR participants like "[1,%"
OR participants like "%,1,%"
如果您愿意将participants
字段的数据结构更改为逗号分隔值(例如1,2
或2,1
,则可以使用:
SELECT * FROM posts WHERE owner_id = 1 OR FIND_IN_SET(1, participants);
您可以使用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,%"
您应该将查询更改为:
SELECT * FROM posts
WHERE (owner_id = 1 OR participants like "%,1" OR participants like "1,%" OR participants like "%,1,%")
这确实不是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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.