2016-08-04 36 views
0

Ich habe folgende MySQL-Abfrage:Wie nicht auf Lager Einheiten bestellen letzten

SELECT 
    * 
FROM 
    product 
INNER JOIN productcontent ON product.id = productcontent.productID 
WHERE 
    product.deactivate <> '1' 
AND productcontent.price > 0 { $level1SQL } 
AND menulevel IN ($imploded) 
OR menulevel = '$menulevelID' { $level1SQL } 
ORDER BY 
    (
     CASE 
     WHEN discountPrice < price 
     AND discountPrice > 0 THEN 
      CAST(
       discountPrice AS DECIMAL (10, 2) 
      ) 
     ELSE 
      CAST(
       price AS DECIMAL (10, 2) 
      ) 
     END 
    ) { $price_order } 
LIMIT { $limit } 

aber ich muß auch sicherstellen, dass, wenn der product.notInStock Satz 1 ist es ganz am Ende bestellt werden (aber nach Name/Preis, wenn eine solche Sortierung gewählt wird), ist es überhaupt möglich oder sollte ich nur 2 Abfragen verwenden - eine für Produkte, die auf Lager sind, und eine für solche, die nicht vorhanden sind?

+0

Vielleicht wollen Sie 'AND (menulevel IN ($ implodiert) ODER menulevel = '$ menulevelID' {$ level1SQL})'? – jarlh

+0

Was sind die möglichen Werte für 'notInStock', 0 und 1? Fügen Sie es dann einfach als erste Spalte Sortieren nach hinzu, andernfalls wenden Sie einen anderen CASE an. Übrigens, bist du sicher, dass die WHERE-Bedingungen die richtigen Zeilen ohne Parens zurückgeben? – dnoeth

Antwort

1

Sie können einen zusätzlichen Schlüssel zum ORDER BY hinzu:

SELECT * 
FROM product p INNER JOIN 
    productcontent pc 
    ON p.id = pc.productID 
WHERE p.deactivate <> '1' AND 
     pc.price > 0 {$level1SQL} AND 
     (menulevel IN ($imploded) OR menulevel = '$menulevelID') 
     {$level1SQL} 
ORDER BY p.not_inStock DESC, 
     (case when discountPrice < price and discountPrice > 0 
       then CAST(discountPrice AS DECIMAL(10,2)) 
       else CAST(price AS DECIMAL(10,2)) 
      end) {$price_order} 
LIMIT {$limit} 

Auch schlägt die letzte Bedingung auf menulevel, dass Sie Klammern benötigen.