2014-10-18 103 views
0

我有兩個SQL請求:將SQL結果預加到另一個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']; 
} 

你可以看到這看起來有多醜。下面是僞代碼我想做什麼:類似array_unshift但對於SQL對象

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']; 
} 

的東西嗎?

回答

2

爲什麼不只是在一個查詢中做?你可以做這樣的...

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

這種工作方式是通過欺騙查詢到由分配給它的銷售999999(僅適用於部分訂購的任意數量的將所有行與datelive = -1第一,它將與查詢的實際結果無關)。由於數據庫將按降序排列,因此999999(因此datelive = -1)將首先出現。

+0

乾杯!我並沒有最終使用這種方法,但是你的想法讓我更深入地挖掘並找到了'UNION',這正是我想要的(然後是一些)。 – gator 2014-10-18 09:29:04