2016-04-30 15 views
0

Ich habe eine Tabelle mit dem Namen products, die alle Produkte enthält, z. B. T-Shirt und product_variants, die die zugehörigen Varianten der Farben haben, z. Schwarz, Blau, Grün, jede hat eine stock Spalte - das hält die Anzahl der übriggebliebenen Aktien.MySQL - IF in einem SELECT für mehrreihige Spaltenwerte

Ich möchte eine Abfrage erstellen, die mir sagen kann, welche der Produkte vollständig ausverkauft sind, und welche nicht.

Die stock Spalte sollte 0 sein, um ausverkauft zu sein, aber wenn es NULL oder > 0 ist, ist es auf Lager. NULL wird verwendet, wenn wir unbegrenzte Mengen haben.

Dies ist das folgende Ergebnis i erhalten möchte:

product_id|soldOut|stock 
------------------ 
1   |Yes |0 
2   |Yes |0 
3   |No  |NULL 
4   |No  |1 

Was ich versucht zu, ist die folgende:

  1. greifen alle Produkte
  2. Machen Sie einen Join product_variants
  3. Gruppieren Sie nach product_id, um nur ein Ergebnis pro Produkt anzuzeigen.
  4. der Auswahl product_id und IF(stock > 0 OR stock IS NULL, 'No', 'Yes') as SoldOUt

Abfrage:

SELECT p.product_id, IF(pv.stock > 0 OR pv.stock IS NULL, 'No', 'Yes') as SoldOUt 
FROM products p 
JOIN product_variants pv ON (`pv`.`product_id` = `p`.`product_id`) 
GROUP BY p.product_id 

Die Ergebnisse ist, dass soldOut nicht korrekt ist - es scheint, als ob es eine zufällige Reihe der Varianten nimmt gerade und überprüfen Sie die stock dieser und Antworten.

Stattdessen sollte es alle Varianten Zeile überprüfen und sehen, wenn einige von ihnen noch nicht verkauftOut (mit der if-Anweisung oben) und dann eine endgültige Antwort für dieses Produkt zurückgeben.

Was habe ich falsch gemacht und wie kann dies erreicht werden?

Antwort

1

Zuerst brauchen Sie keine join, nur Aggregation.

So, hier ist eine Methode, die alle Varianten überprüft, ob 0 sind:

select pv.product_id, 
     (case when sum(pv.stock = 0) = count(*) then 'Yes' else 'No' 
     end) as SoldOut 
from product_variants pv 
group by p.product_id; 

ich raten bin, dass Sie für die letzte Spalte auch sum(pv.stock) auch wollen.

+0

Vielen Dank! Gab mir eine neue Art zu denken. – Karem