Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 将ID存储为逗号分隔的值_Mysql_Sql - Fatal编程技术网

Mysql 将ID存储为逗号分隔的值

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所在的表。

如何从数据库中选择ID存储在varchar逗号分隔符中的所有行。例如,我有一个表,其中包含:

, 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