我有一些使用PDO构建和执行查询的PHP。查询从users
表中获取用户名和用户图像,并在PHP for循环中从数组中添加ID参数。因此,一旦构建完成,查询看起来就像这样:
SELECT username, image FROM users WHERE id=4 OR id=2 OR id=16 OR id=8 OR id=9;
PHP期望从查询返回多少行,因为插入了ID值。当所有ID都是唯一的时,这很好用,但是当查询中有相同的ID时,MySQL(高效地)只为每个唯一ID返回一行,如下所示。
SELECT username, image FROM users WHERE id=4 OR id=2 OR id=2 OR id=4 OR id=2;
此查询只返回2行,一行用于ID为4的用户,另一行用于用户ID 2.正如我所说,应用程序需要返回多少行作为提交的ID参数,因此这是一个问题。是否有不同的方法来表达我的SQL查询以强制它返回相同的行?
答案 0 :(得分:1)
让您的应用程序通过取出重复项来优化输入数据。因此,只会发送两个ID,两行将满足预期。
答案 1 :(得分:0)
您可以过滤数组,仅采用唯一值,然后在查询中使用IN:
<?php
$array = array(2, 3, 4, 5, 5, 5, 4, 3, 2, 1);
$array = array_unique( $array );
// when only numeric values
$values = implode(",", $array );
// when strings
//$values = "'" . implode("','", $array ) . "'";
$query = 'SELECT username, image FROM users WHERE id IN( ' . $values . ')';
?>
答案 2 :(得分:0)
获取数组中每个值的频率。 之后,创建一个循环并编写一个带有每个id限制的查询,然后联合所有查询。
<?php
$array = array(2, 4, 2, 2, 4);
$values = array_count_values($array);
$query = array();
foreach ($values as $id => $frequency)
{
$query[] = "SELECT username, image FROM users WHERE id = {$id} LIMIT {$frequency}";
}
$query = implode(" UNION ", $query);