我有一个包含一些记录和列的数据库:"输入"," id"和别的。我想用任何"类型"选择所有记录。在数组$ typearray中提到但没有记录哪个id在$ idarray中。我试着做类似的事情:
$result = mysql_query("SELECT * FROM db
WHERE type IN('".implode("','",$typearray)."')
AND id NOT IN('".implode("','",$idarray)."')
ORDER BY date DESC LIMIT 10");
但它似乎不起作用 -
type IN('".implode("','",$typearray)."')
条件工作正常,但第二个没有。起初我认为问题出在列类型上 - 两个数组都包含字符串,"类型" column是VARCHAR(10),id是INT,但将其更改为字符串并没有帮助。我做错了什么?
修改
如果我打印一个查询,我会得到这个:
SELECT * FROM db
WHERE type IN('apple','tomato','potato')
AND id NOT IN('20','1','10','15','8')
ORDER BY date DESC LIMIT 10
第一个条件很好:它只选择苹果,西红柿和土豆。第二个条件什么都不做,即使我手动输入:
id NOT IN('20','1','10','15','8')
或
id NOT IN('20,1,10,15,8')
或
id NOT IN(20,1,10,15,8)
它仍然失败。
EDIT2:
其实忘记了。我是个白痴。我把我的变量混淆了一下......
答案 0 :(得分:0)
你应该在mysql工作台上尝试这个查询,或至少做一个echo $result, "\n";
来查看它给出的内容。
我会说当查询不起作用时的默认行为:首先在Mysql Workbench中(或任何像Toad,Squirrel这样的SQL运行器......)
$result = mysql_query("SELECT * FROM db
WHERE type IN('".implode("','",$typearray)."')
AND id NOT IN('".implode("','",$idarray)."')
ORDER BY date DESC LIMIT 10");
如果$typearray
为空,则表示您正在寻找可能永远不匹配的type IN ('')
。
如果$idarray
为空,则表示您正在查找可能始终匹配的id not in ('')
。
如果$typearray
或$idarray
包含无效字符,您将收到错误。
[编辑]顺便说一句,如果$typearray
或$idarray
可能包含无效字符,您可以使用array_map和mysqli_escape_string:
$result = mysql_query("SELECT * FROM db
WHERE type IN('".implode("','", array_map('mysql_escape_string', $typearray))."')
AND id NOT IN('".implode("','", array_map('mysql_escape_string', $idarray))."')
ORDER BY date DESC LIMIT 10");
答案 1 :(得分:0)
您不需要转义整数变量:
...
AND id NOT IN(" . implode(",", $idarray).")
...