SQL IN子句仅返回ID以逗号分隔的列表中具有第一个匹配项的行

马克斯·瑞斯尼科夫(Max Resnikoff):

我有5个用户具有“ shop_access”列(这是商店ID的列表,例如:1,2,3,4)

我正在尝试从数据库中获取所有在shop_access中具有商店ID(例如2)的用户

Current Query:
SELECT * FROM users WHERE '2' IN (shop_access)

但是,它只会返回以数字2开头的具有shop_access的用户。

例如

  • 用户1管理商店1,2,3
  • 用户2管理商店2,4,5
  • 用户3管理商店1,3,4
  • 用户4管理商店2,3

运行IN子句时,唯一返回的是用户2和用户4。

用户1被忽略(因为它在列表中没有数字2 ,所以不应该这样),因为它不是以数字2 开头的。

我目前无法返回并更改其设置方式,例如,将其转换为JSON并首先使用PHP进行处理,因此,如果有人可以尝试使其工作而不必更改列数据(shop_access ),那将是理想的。

专线小巴:

便携式解决方案是使用like

where concat(',', shop, ',') like '%,2,%'

或者,如果要搜索的值作为参数给出:

where concat(',', shop, ',') like concat('%,', ?, ',%')

根据您的数据库,可能会有更整洁的选项。在MuSQL中:

where find_in_set('2', shop)

也就是说,我强烈建议您修复数据模型。在数据库中存储CSV数据在许多方面都破坏了关系数据库的目的。您应该有一个单独的表来存储用户/商店关系,每个元组在单独的行中。推荐阅读:在数据库列中存储分隔列表真的那么糟糕吗?

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在SQL函数中仅替换第一个结果

SQL删除具有相同值的所有连续记录,仅保留第一个和最后一个

具有OR子句和仅一个参数的SQL查询

如何仅检查从SQL查询中的存储过程返回的行的第一个值

SQL条件字段,第一个匹配项JOIN

SQL:选择第一列的第一个匹配项,第二个值不同

将具有逗号分隔的varchar值的表与SQL Server中另一个表的ID值联接

SQL Server:仅选择具有多个列的记录的第一个实例

从SQL表的列表中选择第一个匹配的字符串值

字符串拆分SQL函数仅返回字符串中的第一个单词

SQL Server:使用第一个重复项中的数据更新重复项

SQL获取分配的列表的第一个

SQL Server获得第一个匹配值

从带有条件(第一个字符)的仅SQL项填充ListBox

While循环仅传递第一个sql行

在Oracle SQL的最后一个元素之前连接的逗号分隔列表,带有“和”

SQL:获取GroupBY子句的第一个值

参数列表在SQL上跳过表的第一个ID

SQL 2插入基于第一个的返回

SQL加密仅返回第一个字符

别名选择器不起作用的SQL IN运算符仅返回第一个匹配项

SQL 获取第一个匹配的行

选择具有第一个条件的第三个表 [SQL]

SQL 删除重复项但仍保留第一个

在 SQL 中的第一个事务的 30 天内返回所有事务

SQL - SAP HANA - 仅使用列表中的第一个条目(基于日期/时间)

如何在Snowflake sql中仅使用值更新第一个NULL列?

Oracle SQL - 在 LEFT JOIN 子句上重用第一个表中的列

如何使用多个近似匹配执行复杂的 SQL 连接并仅返回第一个匹配