我有这个查询:
"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"
,$id
像3
。您收到误报。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
我不确定你想达到什么目的。如果ids
是informations
中的一列,那么您的代码只是表达"SELECT * FROM informations WHERE ids = ". $id "
的一种奇怪方式;如果它是一个字符串,我不明白为什么你根本不需要WHERE
:表达式$id in (1,2,3,4,5)
是常量,它不需要与数据库交互;在任何情况下,您要么从informations
中抓取所有行,要么不抓取。
更新
另一个建议:也许ids
是informations
中的一个字符串字段,其中包含"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 .")";