我有两个SQL请求:
$priority = $db->prepare("
SELECT *
FROM products
WHERE datelive = -1
");
$priority->execute();
$catalogue = $db->prepare("
SELECT *
FROM products
WHERE hidden = 0
AND datelive != -1
ORDER BY numbought DESC
");
$catalogue->execute();
我以前只有第二个查询,它会显示按销售单位数量排序的产品库存,但不包括datelive = -1
的隐藏项目和项目。 datelive = -1
保留用于高优先级的项目,应该出现在前面,因此是第一个查询。
如何实现显示第一个查询和第二个查询的内容的结果,但不重复显示两次的代码?我想将第一个SQL结果附加到第二个SQL结果的前面,这样我就可以用一个代码块显示它。
$prio = $priority->fetchAll(PDO::FETCH_ASSOC);
$cata = $catalogue->fetchAll(PDO::FETCH_ASSOC);
for ($j = 1; $j < $priority->rowCount()+1; $j++) {
echo $prio[$j-1]['price'];
echo $prio[$j-1]['name'];
echo $prio[$j-1]['size'];
}
for ($i = 1; $i < $catalogue->rowCount()+1; $i++) {
echo $cata[$i-1]['price'];
echo $cata[$i-1]['name'];
echo $cata[$i-1]['size'];
}
你可以看到这看起来多么丑陋。下面的伪代码是我想要做的:
append_to_front($catalogue, $priority); // adds $priority to front of $catalogue
$cata = $catalogue->fetchAll(PDO::FETCH_ASSOC);
for ($i = 1; $i < $catalogue->rowCount()+1; $i++) {
echo $cata[$i-1]['price'];
echo $cata[$i-1]['name'];
echo $cata[$i-1]['size'];
}
类似于array_unshift
但是对于SQL对象?
答案 0 :(得分:2)
为什么不在一个查询中执行此操作?你可以这样做......
SELECT *
FROM products
WHERE hidden = 0
ORDER BY CASE WHEN datelive = -1 THEN 999999 ELSE numbought END DESC
这样做的方法是通过欺骗查询将所有行首先放置datelive = -1
,为其分配任意数量的999999销售额(仅用于订购部分;它与实际结果无关)的查询)。由于数据库将按顺序排序结果,因此将首先显示999999(因此datelive = -1
)。