将ID存储为逗号分隔值

时间:2012-03-30 14:19:35

标签: mysql sql

如何从数据库中选择具有以varchar逗号分隔的ID的所有行。例如,我有一个表格:

, 7, 9, 11

如何使用这些ID选择行?

6 个答案:

答案 0 :(得分:4)

规范化您的数据库。您最有可能使用查找表。

答案 1 :(得分:1)

您有两个选择:

  1. 使用函数将字符串拆分为临时表,然后将您选择的表连接到该临时表。
  2. 使用动态SQL查询id为(@variable)的表格 - 如果选择这种方式则选择不好。

答案 2 :(得分:0)

select * from table_name where id in (7, 9, 11)

如果您在开始时通常使用该逗号,则需要先将其删除。

答案 3 :(得分:0)

  

对('7,9,11')

使用匹配(列)

这将显示你的id的所有varchar列,其中有7,9,11。 但你必须保持你的专栏有全文索引。

答案 4 :(得分:0)

就在昨天,我正在修复一个旧应用程序中的错误,并看到他们在哪里处理它:

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实际上是否有一个值(由于先前的逻辑将默认值,这总是如此。

我个人虽然会像其他人建议的那样做,但我会创建我一直称为桥接表的桥接表,允许你从一个表中获得与另一个PK相关的0到多个PK。

多年前我不得不解决这个问题,我无法更改表结构,我创建了一个自定义表类型和一组函数,因此我可以通过SQL处理这些值,就像它们来自一个表一样。那个自定义表类型的解决方案虽然是特定于Oracle的,但我不知道如何在没有我研究的情况下在MySQL中这样做。

答案 5 :(得分:0)

有一个原因查询列表非常困难:数据库不适用于分隔列表。它们经过优化,可以最好地处理行(或集合)数据。创建正确的表结构将带来更好的查询性能和更简单的SQL查询。 (因此,虽然技术上可行,但您应该认真考虑将数据库规范化,如托德和其他人所建议的那样。)

Many-to-many关系最好用三(3)个表来表示。假设您正在销售"小部件"在各种"尺寸"。创建两个表示主要实体的表:

小工具 (独特的小部件)

WidgetID | WidgetTitle
1        | Widget 1
2        | Widget 2
....

尺寸 (独特尺码)

SizeID  | SizeTitle
 7      | X-Small
 8      | Small
 9      | Medium
10      | Large
11      | X-Large

然后创建一个联结表,以存储这两个实体之间的关系,即哪些小部件可用的大小

WidgetSize (每个小部件的可用尺寸)

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
....

使用该结构,您可以轻松返回具有任何(或全部)大小列表的所有小部件。没有测试,但类似于下面的sql应该工作。

  • 查找任何尺寸的小部件:<cfset listOfSizes = "7,9,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" > 
                      )
           )
    
  • 查找所有三种尺寸的小部件:<cfset listOfSizes = "7,9,11">

      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