1

可能重复:
mysql 检查数字是否在逗号分隔的列表中

注意:请不要告诉我规范化我的数据库

好的,所以我需要的是如果 id 存在于另一个用逗号分隔的表中,则仅获取行......但我不知道如何选择

table1

script_id | name | user_id
+-------------------------+
   33       demo    256

table2

has_access| name |user_id
+-------------------------+
 33,34,56   demo    256

table1所以我希望只有当 id 存在于列中时才返回行table2 has_access,而且我需要精确,所以如果 ID 得到 33,或者 333 应该不同......我需要精确的值匹配

4

5 回答 5

3

Mysql 具有FIND_IN_SET针对这种数据的功能:

.... WHERE find_in_set(table1.script_id,table2.has_access)

但是你最好norma对不起,无法抗拒。

于 2013-01-16T19:14:17.640 回答
2

请不要告诉我们要告诉你什么。

首先阅读:在数据库列中存储分隔列表真的那么糟糕吗?
简短的回答:是的,这真的很糟糕。

和类似的:使用逗号分隔的多个外键是否错误,如果是,为什么?
简短的回答:是的,这是非常非常错误的。

规范化您的数据库。

于 2013-01-16T19:12:58.517 回答
0

这是一个简单的方法:

select *
from table1
where concat(',', has_access, ',') like concat('%,', YOURIDTOTEST, ',%') 

这用逗号(分隔符)分隔每个值。然后它在列表的开头和结尾放置一个逗号,并在第二个“喜欢”第一个时匹配。

于 2013-01-16T19:12:54.540 回答
0

我会看一下find_in_set mysql 函数(我假设这就是您正在使用的,因为它是帖子被标记的内容)。我没有尝试过,但是由于您的has_access列是字符串,因此您应该匹配字符串,而 333 之类的内容不会与 33 匹配。

于 2013-01-16T19:16:43.887 回答
0

select table1.* from table1 join table2 on ( table2.has_access = table1.script_id or table2.has_access like concat(table1.script_id, ',%') or table2.has_access like concat('%,', table1.script_id, ' ,%') 或 table2.has_access 像 concat('%,', table1.script_id) )

我想我涵盖了所有情况。

于 2013-01-16T19:17:27.613 回答