在SQL条件问题中的位置


WHERE IN SQL condition problem

我有这个查询:

"SELECT * FROM informations WHERE ". $id ." IN (ids)"

仅当 $id 是 id 中的第一个值时,它才有效......在 ID 中,值为"1,2,3,4,5"。

有没有办法让它与其他 id 一起工作?

这对你有用吗?

"SELECT *
 FROM Informations
 WHERE ids LIKE '"" . $id . ", %'" -- try to match against the first value in ids
 OR ids LIKE '"%," . $id . ",%'" -- try to match against a value in ids that is neither the first nor the last value
 OR ids LIKE '"%," .$id . "'"  -- try to match against the last value found in ids"

如果ids是包含逗号分隔值的字段,则查询如下所示:

SELECT * FROM `informations` WHERE 3 IN ("1,2,3,4,5")

而不是它应该是什么:

SELECT * FROM `informations` WHERE 3 IN (1,2,3,4,5)

没有执行自动标记化(,上的拆分(;ids的一个值不会自动转换为列表,以便IN可以工作。

不幸的是,您的桌子设计在这里已经失败了。是否可以使用数据库规范化原则将 ID 拆分为单独的表?

然后,您的查询可能如下所示:

SELECT * FROM `informations` WHERE 3 IN (
   SELECT `id`
     FROM `ids`
    WHERE `informations`.`id` = `ids`.`information_id`
)
顺便说一句,"信息">

是一个不可数的名词,因此,"信息"是错误的。


更新(感谢您的想法,a1ex07!

虽然这是黑客行为,我仍然建议修复您的表格布局,但我会很友善并建议快速修复。

Willempie与以下方面关系密切:

$query = 'SELECT *
            FROM `informations`
           WHERE `ids` LIKE "%' . $id . '%"';

不幸的是,通配符匹配还不够强大。考虑一下ids是否像"1,6,9,12,35,4"$id3。您收到误报。LIKE语句需要注意逗号。

您可以添加多个案例:

$query = 'SELECT *
            FROM `informations`
           WHERE `ids` LIKE "%,' . $id . ',%"
              OR `ids` LIKE "%,' . $id . '"
              OR `ids` LIKE "' . $id . ',%"';

或者,为简洁起见,您可以使用正则表达式解决此问题:

$query = 'SELECT *
            FROM `informations`
           WHERE `ids` REGEXP "(^|,)' . $id . '(,|$)"';

对于您希望查找的任何$id,之前必须是ids(^(或逗号的开头;之后必须是逗号或ids的结尾($(。这可确保必须将$id作为一个整体、逗号分隔的令牌进行查找。

这有点像文字处理器搜索中的"仅整个单词",但用逗号分隔"单词"而不是空格。


更新 2

另一种方式使用 FIND_IN_SET ,它在逗号分隔的字符串中执行搜索:

$query = 'SELECT *
            FROM `informations`
           WHERE FIND_IN_SET("' . $id . '", `ids`)';

您的查询在技术上是正确的,但"ids"的值不正确。

应将 id 的值括在单引号内。如果我在不使用 id 的情况下编写代码,它将是这样的:

"SELECT * FROM informations WHERE ". $id ." IN ('1','2','3','4','5')"

有关此规则的更多信息,请访问:http://dev.mysql.com/doc/refman/5.1/en/comparison-operators.html#function_in

我不确定你想达到什么目的。如果idsinformations中的一列,那么您的代码只是表达"SELECT * FROM informations WHERE ids = ". $id "的一种奇怪方式;如果它是一个字符串,我不明白为什么你根本不需要WHERE:表达式$id in (1,2,3,4,5)是常量,它不需要与数据库交互;在任何情况下,您要么从informations中抓取所有行,要么不抓取。

更新
另一个建议:也许idsinformations中的一个字符串字段,其中包含"1,2,3,4,5"。在这种情况下,您无法通过使用 WHERE ... IN 获得预期的结果。您需要使用 REGEXP 来检查字符串是否包含您的数字。

它必须是列名,然后是IN(此处为逗号分隔值(。

SELECT column_name(s)
FROM table_name
WHERE column_name IN (value1,value2,...)

你在 sql 语法中犯了一个错误。

这是正确的语法

"SELECT * FROM informations WHERE ids IN (". $id .")";