【问题标题】:Selecting A Row Based On One Value In A Multi-Value Array Using IN Clause使用 IN 子句根据多值数组中的一个值选择一行
【发布时间】:2013-05-13 16:28:35
【问题描述】:

我在数据库中有一个列,其值存储为逗号分隔的数组;假设数据库中的示例条目是:1、5、8、15

我现在正在尝试在 SELECT 语句中使用此数据,以允许用户在数据库中选择一个条目,其中该数组包含他们选择的值(这些值与我实际加入的查找表相关联)应用程序,用户看不到整数)。

我简化的 SELECT 语句本质上是:

$arrayvalue = "1";

   $query = "SELECT * FROM table WHERE tablearray IN ($arrayvalue)";

在本例中,我输入 1 作为要搜索的数组值;实际上,该变量是由用户控制的表单输入中的 POST 填充的。

'tablearray' 是包含逗号分隔数组的列的名称,我们说它会包含 1、5、8、15 作为示例(尽管它在现实中有所不同)。

当我为数组中的第一个值选择但不返回时,此带有 IN 子句的语句现在对我来说适用于表列中只有一个值或数组中有多个值的数据如果我选择第二个值,即如果我将 $arrayvalue 设置为 1 它可以工作,但到 5 它不会在我的结果中返回该行。

此时我不需要从数组中选择多个值,我只希望它能够从表列中选择一个值,而不管该整数在数组中的哪个位置。我怀疑我在这里遗漏了一些简单的东西,如果你能提供帮助,谢谢。

【问题讨论】:

  • 为什么要以这种非规范化的方式存储数据?正常形式是将这些值中的每一个作为单独的表中的单独行。

标签: mysql arrays in-clause


【解决方案1】:
SELECT * FROM table WHERE tablearray LIKE CONCAT('%',$arrayvalue,'%');

为避免在下面的评论中发现 '5' 找到 '15' 等...问题,您可以使用以下模式,该模式假定值由逗号分隔,逗号前后没有空格。

WHERE   tablearray LIKE CONCAT('%,',$arrayvalue,',%')
OR      tablearray LIKE CONCAT($arrayvalue,',%');
OR      tablearray LIKE CONCAT('%,',$arrayvalue)

顺便说一句,这实际上是围绕这些属性应该被规范化为行这一事实的全部破解。

【讨论】:

  • 我之前尝试过使用 LIKE,但我遇到的问题是,如果我有 $arrayvalue = "5",它将返回 5 和 15,因为两者都包含整数 "5 ";在这个例子中,我只需要返回值为 5 的行,而不是如果它们包含 15 或 55 或 25 等...
  • 谢谢,这确实有助于解决问题。只是为了我自己的教育,在表列中存储数组有什么问题?整数对应于数据库中的另一个表,它连接到以便在我展开数组后在输出中为用户标记整数;我不知道在数据库中存储一个数组并在输出中爆炸它是不正常的,如果有更好的方法,请告诉我,非常感谢您的帮助!
  • 下面有详细解释。
【解决方案2】:

针对上述 cmets 中提出的问题 re: Normal Form

我不知道您在整数数组中存储了哪些数据。作为示例,我将使用示例关系“Person Knows Pogramming Language”,其中(使用您的方法)您可以将语言 ID 直接存储在 person 表中。示例数据可能如下所示;

Language Table
ID  | Name
------------
1   | C#
2   | SQL
3   | Java

Person Table
ID  | Name  | Languages
-------------------------
1   | Tom   | 1,2
2   | Dick  | 2,3
3   | Harry | 1,2,3

普通表单会将人与语言的关系移动到一个单独的表中(谷歌搜索“外部参照表”)。让我们调用表 PersonLanguage。添加此内容时,我们会从 person 表中删除“Languages”列。

PersonLanguage
PersonID    | LanguageID
--------------------------
1           | 1
1           | 2
2           | 2
2           | 3
3           | 1
3           | 2
3           | 3

现在如果你只想要了解Java的人,你的查询如下

SELECT  P.NAME
FROM    PERSON P
INNER JOIN
        PERSONLANGUAGE PL
ON      P.ID = PL.PERSONID
INNER JOIN
        LANGUAGE L
ON      PL.LANGUAGEID = L.ID
WHERE   L.NAME = 'JAVA'

【讨论】:

  • Declan_k,谢谢,是的,上面的示例类似于我在表中存储数组的原因,例如 Person 表中用于 Languages 的示例,然后将其与类似的单独表连接起来您的语言表示例;我可能在最初的问题中沟通得不够好,很高兴知道我在正确的轨道上,再次感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多