2016-11-21 3 views
0

Ich habe eine Tabelle mit zwei Tabellen, wo eine Tabelle Produktdaten und die anderen Preisdaten einschließlich mehrerer Rabattpreise enthält. Nicht jedes Produkt hat mehrere Einträge in der Preistabelle, da einige Produkte nur einen Einheitspreis haben. Was ich herausfinden möchte, ist in meiner Auswahl, wie man eine Flagge setzt, die mich wissen lässt, ob ein Produkt mehrere Preise zur Verfügung hat.mysql join Wählen Sie den niedrigsten Preis Flag

Der Code, den ich jetzt habe (siehe unten) gibt die Produkte zurück und findet den niedrigsten Preis für jedes Produkt. Wie gesagt, nicht alle Produkte haben einen "niedrigsten Preis". Ich versuche zu bestimmen, ob der Preis, der mit dem Produkt kommt, ein einheitlicher Preis oder ein niedrigster Preis ist.

SELECT products.* 
    , products_pricing.* 
    FROM products 
    LEFT 
    JOIN products_pricing 
    ON products.product_id = products_pricing.product_id 
    LEFT 
    JOIN products_pricing AS filter 
    ON products_pricing.product_id = filter.product_id 
    AND products_pricing.qty_price > filter.qty_price 
WHERE filter.product_id IS NULL 
    AND products.product_active > 0 
ORDER 
    BY products.product_id DESC 
+1

(Ich bin mit MySQL nicht vertraut), aber könnten Sie die Produkte abfragen? Vielleicht so etwas, wo Sie sich einer Unterabfrage anschließen oder diese als 'Ansicht' speichern, der Sie beitreten? SELECT \t MIN (Preis), CASE WHEN COUNT (*) = 1 THEN 1 ELSE 0 END AS SINGLE_PRICE VON PRODUKTEN GROUP BY PRODUCT_ID – Sean

+0

Was das gewünschte Ergebnis aussehen würde? Besser noch, siehe http://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-very-simple- sql-query – Strawberry

Antwort

0

Aus Ihrer Beschreibung entnehme ich, dass jedes Produkt mindestens einen Preis in products_pricing hat, so dass keine Notwendigkeit für eine äußere Verknüpfung.

Anstatt das Anti-Join-Muster zu verwenden, würde ich mich einfach dem aggregierten Produkt anschließen. Verwenden Sie einen Vergleich von min/max oder eine Zählung, um dann zu Ihrer Flagge zu gelangen.

select 
    p.*, 
    pp.*, 
    case when ppm.min_qty_price = ppm.max_qty_price then 'single' else 'multi' end as flag 
from products p 
join products_pricing pp on pp.product_id = p.product_id 
join 
(
    select product_id, min(qty_price) as min_qty_price, max(qty_price) as max_qty_price 
    from products_pricing 
    group by product_id 
) ppm on ppm.product_id = pp.product_id 
     and ppm.min_qty_price = pp.qty_price 
where p.product_active > 0 
order by p.product_id desc; 
+0

Neu hier und nicht sicher, ob es in Ordnung ist, Dank zu sagen, also auf die Gefahr hin, SO politisch unkorrekt zu sein ... Danke! Dies tat genau das, was ich brauchte und perfekt funktionierte. – NTFM

0

Wenn Sie die ganze Spalte aus den beiden Tabellen dpn't müssen aber nur die relevanten Spalten

SELECT products.product_id, count(*) as num_of_price 
    , case when count(*) > 1 then 'MULTI PRICE' ELSE 'SINGLE PRICE' as flag_price 
    FROM products 
    LEFT 
    JOIN products_pricing 
    ON products.product_id = products_pricing.product_id 
WHERE products.product_active > 0 
    GROUP BY products.product_id 
ORDER 
    BY products.product_id DESC 

während, wenn Sie alle Spalten benötigen, können Sie dieses Ergebnis kommen

SELECT products.* 
    , products_pricing.* 
    , t.* 
    FROM products 
    LEFT JOIN products_pricing ON products.product_id = products_pricing.product_id 
    LEFT JOIN (
     SELECT products.product_id, count(*) as num_of_price 
     , case when count(*) > 1 then 'MULTI PRICE' ELSE 'SINGLE PRICE' as flag_price 
     FROM products 
     LEFT 
     JOIN products_pricing 
     ON products.product_id = products_pricing.product_id 
    WHERE products.product_active > 0 
     GROUP BY products.product_id 
    ) T ON products.product_id = T.product_id 
ORDER 
    BY products.product_id DESC 
Verwandte Themen