将SQL结果前置到另一个SQL结果?

时间:2014-10-18 06:53:32

标签: php sql pdo

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

1 个答案:

答案 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)。