将SQL结果预处理为另一个SQL结果


Prepend SQL result to another SQL result?

我有两个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对象?

为什么不在一个查询中完成?你可以这样做。。。

SELECT *
    FROM products
    WHERE hidden = 0
    ORDER BY CASE WHEN datelive = -1 THEN 999999 ELSE numbought END DESC

其工作方式是通过向查询分配999999的任意销售额(仅针对订购部分;它与查询的实际结果无关),诱使查询将所有datelive = -1行放在第一位。由于数据库将按降序排列结果,999999(因此datelive = -1)将首先出现。