我有这个问题:
"SELECT * FROM informations WHERE ". $id ." IN (ids)"
仅当$ id是来自ids的第一个值时才有效...在ids值为“1,2,3,4,5”。
有没有办法让它与其他ID一起使用?
答案 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)
我不确定你想要实现的目标。如果ids
是informations
中的一列,那么您的代码只是一种表达"SELECT * FROM informations WHERE ids = ". $id "
的奇怪方式;如果它是一个字符串,我不明白为什么你需要WHERE
:expression $id in (1,2,3,4,5)
是常量,它不需要与数据库交互;在任何情况下,您要么从informations
获取所有行,要么从无。
<强>更新强>
另一个建议:也许ids
是informations
中包含“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"
类似,$id
与3
类似。你得到了误报。 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 .")";