Mysql 将ID存储为逗号分隔的值
如何从数据库中选择ID存储在varchar逗号分隔符中的所有行。例如,我有一个表,其中包含:Mysql 将ID存储为逗号分隔的值,mysql,sql,Mysql,Sql,如何从数据库中选择ID存储在varchar逗号分隔符中的所有行。例如,我有一个表,其中包含: , 7, 9, 11 如何选择具有这些ID的行 select * from table_name where id in (7, 9, 11) 如果在开始时确实有逗号,则需要先删除它 如果您通常在开头有逗号,则需要先将其删除。您有两个选项: 使用函数将字符串拆分为临时表,然后将您选择的表连接到该临时表。 如果选择这种方式,请使用动态SQL查询@variable bad choice中id所在的表。
, 7, 9, 11
如何选择具有这些ID的行
select * from table_name where id in (7, 9, 11)
如果在开始时确实有逗号,则需要先删除它
如果您通常在开头有逗号,则需要先将其删除。您有两个选项:
使用函数将字符串拆分为临时表,然后将您选择的表连接到该临时表。
如果选择这种方式,请使用动态SQL查询@variable bad choice中id所在的表。
您有两种选择:
使用函数将字符串拆分为临时表,然后将您选择的表连接到该临时表。
如果选择这种方式,请使用动态SQL查询@variable bad choice中id所在的表。
对'7,9,11'使用匹配列
这将显示您id的所有varchar列,其中有7,9,11。
但你必须是舒尔,你的专栏有全文索引
对'7,9,11'使用匹配列
这将显示您id的所有varchar列,其中有7,9,11。
但你必须是舒尔,你的专栏有全文索引。规范化你的数据库。您最有可能使用的是查找表。规范化数据库。您最有可能使用的应该是查找表。就在昨天,我在这里修复了一个旧应用程序中的一个错误,并看到了他们是如何处理它的:
AND (T.ServiceIDs = '#SegmentID#' OR T.ServiceIDs LIKE '#SegmentID#,%'
OR T.ServiceIDs LIKE '%,#SegmentID#,%' OR T.ServiceIDs LIKE '%,#SegmentID#')
我假设您说的是数据库中ServiceID的值可能包含7,9,11,并且变量SegmentID是一个或多个值。它是在一个CFIF语句中检查SegmentID是否有一个值,这个值总是这样,因为之前的逻辑会默认它
我个人认为我会按照其他人的建议去做,我会创建一个我一直称之为桥接表的表,它允许你从一个表中获得0到多个与另一个表的PK相关的PK
几年前我不得不解决这个问题,因为我无法更改表结构,我创建了一个自定义表类型和一组函数,这样我就可以通过SQL处理值,就像它们来自表一样。不过,这种自定义表类型的解决方案是针对Oracle的,如果没有我的研究,我不知道如何在MySQL中实现这一点。就在昨天,我在这里修复了一个旧应用程序中的一个bug,看到了他们是如何处理它的:
AND (T.ServiceIDs = '#SegmentID#' OR T.ServiceIDs LIKE '#SegmentID#,%'
OR T.ServiceIDs LIKE '%,#SegmentID#,%' OR T.ServiceIDs LIKE '%,#SegmentID#')
我假设您说的是数据库中ServiceID的值可能包含7,9,11,并且变量SegmentID是一个或多个值。它是在一个CFIF语句中检查SegmentID是否有一个值,这个值总是这样,因为之前的逻辑会默认它
我个人认为我会按照其他人的建议去做,我会创建一个我一直称之为桥接表的表,它允许你从一个表中获得0到多个与另一个表的PK相关的PK
几年前我不得不解决这个问题,因为我无法更改表结构,我创建了一个自定义表类型和一组函数,这样我就可以通过SQL处理值,就像它们来自表一样。不过,这种自定义表类型的解决方案是针对Oracle的,如果没有我的研究,我不知道如何在MySQL中做到这一点。查询列表如此困难的原因在于:数据库不是为使用分隔列表而设计的。它们经过优化,可以最好地处理行或数据集。创建适当的表结构将导致更好的查询性能和更简单的sql查询。因此,在技术上是可能的,你应该认真考虑数据库的规范化,如托德和其他人所建议的。 关系最好用三个表来表示。假设您正在销售各种尺寸的小部件。创建两个代表主要实体的表: 小部件独特的小部件 大小唯一大小 然后创建一个连接表,以存储这两个实体之间的关系,即哪些小部件可用,大小如何 WidgetSize每个小部件的可用大小 使用这种结构,您可以轻松返回所有具有任意或所有大小列表的小部件。未测试,但类似于下面sql的东西应该可以工作 查找任何大小的可用小部件: 查找所有三种尺寸的小部件:
查询列表如此困难有一个原因:数据库不是为使用分隔列表而设计的。它们经过优化,可以最好地处理行或数据集。创建适当的表结构将导致更好的查询性能和更简单的sql查询。因此,在技术上是可能的,你应该认真考虑数据库的规范化,如托德和其他人所建议的。 关系最好用三个表来表示。假设您正在销售各种尺寸的小部件。创建两个代表性的表 主要实体: 小部件独特的小部件 大小唯一大小 然后创建一个连接表,以存储这两个实体之间的关系,即哪些小部件可用,大小如何 WidgetSize每个小部件的可用大小 使用这种结构,您可以轻松返回所有具有任意或所有大小列表的小部件。未测试,但类似于下面sql的东西应该可以工作 查找任何大小的可用小部件: 查找所有三种尺寸的小部件:
您可能需要考虑将这些ID拆分到单独的表中。将它们存储为逗号分隔的值将是维护的噩梦。性能也将是一个问题。这不是在数据库中存储数据的方式,而且更容易出错。如果存储整数,结果总是相同的。但在存储字符串时,搜索7将不会产生与7.0相同的结果,甚至不会产生7space+1用于规范表。您可能需要考虑将这些ID拆分为单独的表。将它们存储为逗号分隔的值将是维护的噩梦。性能也将是一个问题。这不是在数据库中存储数据的方式,而且更容易出错。如果存储整数,结果总是相同的。但在存储字符串时,搜索7将不会产生与7.0相同的结果,甚至不会产生7space+1用于规范化表格。在这种情况下,当搜索9、7、11时会发生什么?相同的结果,因为match-On分别匹配每个逗号分隔的值。当搜索9、7、11时会发生什么,11在这种情况下?相同的结果,因为match-On分别匹配每个逗号分隔的值。这不起作用-他将ID作为CSV存储在一列中。正如所指出的,这不起作用,因为数据是如何存储的。这不起作用-他将ID作为CSV存储在一列中。正如所指出的,这将不起作用,因为数据是如何存储的。不确定查找表的确切含义。您应该有一个包含PK引用的表,并且上面的每个值都有一行。7,9,11应在另一个表中的数据库中作为三条单独的记录列出。不确定查找表的确切含义。您应该有一个包含PK引用的表,以及上面每个值的一行。7,9,11应在另一个表的数据库中作为三个单独的记录列出
SizeID | SizeTitle
7 | X-Small
8 | Small
9 | Medium
10 | Large
11 | X-Large
WidgetID | SizeID
1 | 7 <== Widget 1 "X-Small"
1 | 8 <== Widget 1 + "Small"
2 | 7 <== Widget 2 + "X-Small"
2 | 9 ....
2 | 10
2 | 11
....
SELECT w.WidgetID, w.WidgetTitle
FROM Widget w
WHERE EXISTS
( SELECT 1
FROM WidgetSize ws
WHERE ws.WidgetID = w.WidgetID
AND ws.SizeID IN (
<cfqueryparam value="#listOfSizeIds#"
cfsqltype="cf_sql_integer" list="true" >
)
)
SELECT w.WidgetID, w.WidgetTitle, COUNT(*) AS MatchCount
FROM Widget w INNER JOIN WidgetSize ws ON ws.WidgetID = w.WidgetID
WHERE ws.SizeID IN (
<cfqueryparam value="#listOfSizeIds#"
cfsqltype="cf_sql_integer" list="true" >
)
GROUP BY w.WidgetID, w.WidgetTitle
HAVING MatchCount = 3