WHERE IN SQL条件问题

时间:2011-06-11 15:43:02

标签: php sql

我有这个问题:

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

仅当$ id是来自ids的第一个值时才有效...在ids值为“1,2,3,4,5”。

有没有办法让它与其他ID一起使用?

6 个答案:

答案 0 :(得分:1)

这对你有用吗?

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

答案 1 :(得分:0)

您的查询在技术上是正确的,但'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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

如果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`
)
BTW,“信息”是一个不可数名词,因此,“信息”是错误的。


更新(感谢您的想法,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 . ',%"';

或者,为简洁起见,您可以使用regular expressions

解决此问题
$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`)';

答案 4 :(得分:-1)

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

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

答案 5 :(得分:-2)

你在sql语法中做错了。

这是正确的语法

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