我需要做一个按ID过滤的查询,但我需要限制每个ID的结果。我不知道如何在一个查询中做到这一点,我只能用PHP循环每个ID,在每次迭代中执行一个查询,然后将结果合并在一起:
$allResults = [];
$ids = [1, 2, 3, 4, 5];
foreach ($ids as $id) {
$db->query("
SELECT *
FROM example_table
WHERE example_id = $id
ORDER BY rating DESC
LIMIT 2
");
$results = $db->getResults();
$allResults = array_merge($allResults, $results);
}上面做了我需要的,但是我如何在一个查询中做到这一点,而不是5个查询的循环呢?
我在找这样的东西:
SELECT *
FROM example_table
WHERE
example_id = 1 LIMIT 2 OR
example_id = 2 LIMIT 2 OR
example_id = 3 LIMIT 2 OR
example_id = 4 LIMIT 2 OR
example_id = 5 LIMIT 2
ORDER BY rating DESC显然,where子句中的限制抛出了一个错误,但您可以看到我试图实现的目的。感谢您的帮助。
发布于 2018-02-02 05:54:26
您可以使用以下UNION查询:
(SELECT * FROM example_table WHERE id = 1 ORDER BY rating DESC LIMIT 2)
UNION ALL
(SELECT * FROM example_table WHERE id = 2 ORDER BY rating DESC LIMIT 2)
UNION ALL
(SELECT * FROM example_table WHERE id = 3 ORDER BY rating DESC LIMIT 2)
UNION ALL
(SELECT * FROM example_table WHERE id = 4 ORDER BY rating DESC LIMIT 2)
UNION ALL
(SELECT * FROM example_table WHERE id = 5 ORDER BY rating DESC LIMIT 2)以下是在PHP中创建它的一种方法:
$ids = [1, 2, 3, 4, 5];
$sqlArray = array_map(function($id){
$id = (int)$id;
return "(SELECT * FROM example_table WHERE id = $id ORDER BY rating DESC LIMIT 2)";
}, $ids);
$sql = implode("\nUNION ALL\n", $sqlArray);演示:http://rextester.com/GNDR46232
您还应该考虑使用占位符准备查询并绑定ids。因为我不知道$db的类是PDO方法:
$ids = [1, 2, 3, 4, 5];
$sqlArray = array_map(function($id){
return "(SELECT * FROM example_table WHERE id = ? ORDER BY rating DESC LIMIT 2)";
}, $ids);
$sql = implode("\nUNION ALL\n", $sqlArray);
$stmt = $db->prepare($sql);
$stmt->execute($ids);
$allResults = $stmt->fetchAll(PDO::FETCH_ASSOC);https://stackoverflow.com/questions/48571748
复制相似问题