0

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

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

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

$arrayvalue = "1";

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

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

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

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

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

4

2 回答 2

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)

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

于 2013-05-13T16:57:34.213 回答
1

针对上述评论中提出的问题:正常形式

我不知道您将哪些数据存储在整数数组中。作为示例,我将使用示例关系“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'
于 2013-05-13T19:24:05.683 回答