我编写了一个php脚本,它在数组中返回任意数量的特定id(以数字格式)。我想创建一个新查询,从属于每个id的表中选择每一行。我知道我可以进行1次查询以获得具有匹配ID的一行。但我想在一个查询中完成所有这些。这是我的代码:
$id = array(1,4,7,3,11,120); // The array containing the ids
$query = mysql_query("SELECT *
FROM posts
WHERE id = '$id[0]'");
// I would like to Do this for each id in the array and return it as one group of rows.`
答案 0 :(得分:3)
我想你想要IN
条款:
$idList = implode(",", $id);
SELECT *
FROM posts
WHERE id IN ( $idList );
implode()
函数会将您的数字数组转换为逗号分隔的相同值的字符串。当您将其用作IN
子句的一部分时,它会告诉数据库将这些值用作查找表以匹配id
。
标准免责声明/警告:
与任何 SQL查询一样,您实际上不应该将变量直接连接到查询字符串中。你只是打开自己的SQL注入。改为使用预备/参数化语句。
答案 1 :(得分:2)
使用PHP's implode function将数组转换为逗号分隔值字符串。
然后,您可以使用SQL IN clause运行单个SQL语句,其中包含与从PHP捕获的ID相关联的值:
$id = array(1,4,7,3,11,120);
$csv = implode(',', $id);
$query = sprintf("SELECT *
FROM posts
WHERE id IN (%s)",
mysql_real_escape_string($csv));
$result = mysql_query($query)
我省略了单引号,因为在SQL中处理数值时不需要它们。如果id
值是字符串,则每个值都必须封装在单引号内。
答案 2 :(得分:1)
你想要的是SQL的IN
子句。
SELECT * FROM posts WHERE id IN (1, 4, 7, 11, 120)
在PHP中,您可能需要以下内容:
$query = mysql_query(sprintf("SELECT * FROM posts WHERE id IN (%s)", implode(',', $id)));
显然,假设你知道你有$ id的整数值,并且$ id的值不是来自用户(也就是说,它们应该被消毒)。为了安全起见,你真的应该这样做:
$ids = implode(',', array_map('mysql_real_escape_string', $id));
$query = mysql_query("SELECT * FROM posts WHERE id IN ($ids)");
如果动态生成$ id,请不要忘记在该子句中放入某些,因为SELECT * FROM foo WHERE bar IN ()
会给您一个错误。我通常确保将我的IN子句变量设置为0,因为IN (0)
是好的,主键几乎不是0。