/ / MySQL JOIN Tabellen mit referenzierten Spalten - mysql, join

MySQL JOIN Tabellen mit referenzierten Spalten - mysql, join

Ich versuche, die meisten (30) bestellten Produkte von der DB zu bekommen.

In der Tabellenreihenfolge habe ich einen Spaltentyp, dessen Werte (1 ODER -1) sind. 1 für gültige Benutzerbestellung, -1 für eine Stornierungsbestellung (in diesem Fall hat die Bestellung eine Referenz-ID zur Benutzerbestellung)

Referenz-ID ist eine ID einer anderen Bestellung (in derselben Auftragstabelle) | eine Zeile verweist auf eine andere Zeile.

Bestellungstabelle:

id   |   reference_id  | type
----------------------------------
1    |                 | 1
----------------------------------
2    |                 | 1
----------------------------------
3    |   1             | -1
----------------------------------

Produkt-Tabelle:

id   |   order_id   |   quantity
----------------------------------
a    |   1          |   4
----------------------------------
b    |   2          |   7
----------------------------------
a    |   3          |   2
----------------------------------

MySQL-Abfrage:

SELECT *, sum(product.quantity) as quantity, count(*) as score
FROM product LEFT JOIN order ON ( product.order_id=order.id )
WHERE (..?..) GROUP BY product.id ORDER BY score DESC LIMIT 30;

Dadurch werden alle Produkte in allen Bestellungen ausgewählt, summiert und gezählt.

ABER:

was ich suche, ist:

if(order.type < 0 ){
product.quantity is in minus(-)
(quantity of the Product in the referenced Order MINUS this.product.quantity)
}

wie geht das in der SQL-Anweisung? Ich habe einige Dinge ausprobiert, aber ohne Erfolg

wie in den Kommentaren angefordert Beispiel: Ergebnis sollte eine Liste der bestellten Produkte sein, gruppiert nach product.id Meist bestellte Produkte:

Product-id   |   quantity
-------------------------------------------
a            |   2 (in 2 Orders)
-------------------------------------------
b            |   7 (in 1 Order)
-------------------------------------------
c            |   12 (in 3 Orders)
-------------------------------------------
...etc.

Danke vielmals

Antworten:

1 für die Antwort № 1

Dadurch werden die Bestellungen gezählt und die Summe als 9 angegeben

Diese Abfrage funktioniert hier http://www.sqlfiddle.com/#!2/9c3a1/6/0

 SELECT Sum(orders.type * products.quantity) AS quant,
count(products.id) as count,
products.id
FROM   orders
INNER JOIN products
ON orders.id = products.order_id

wenn Sie die Anzahl von 2 wünschen (2 Produkte wurden bestellt)

SELECT Sum(orders.type * products.quantity) AS quant,
count(distinct products.id) as count,
products.id
FROM   orders
INNER JOIN products
ON orders.id = products.order_id

Es wird jeweils 1 gezählt und die Summe 7 und 2 (entsprechend Ihrer letzten Bearbeitung).

SELECT products.id, Sum(orders.type * products.quantity) AS quant,
count(distinct orders.id) as count
FROM   orders
INNER JOIN products
ON orders.id = products.order_id
GROUP BY products.id

Dies gibt genau das, wonach Sie gefragt haben


1 für die Antwort № 2

Ich danke Ihnen allen für Ihre Kommentare und Antworten. aber ich endete mit dieser aussage:

        SELECT *,
SUM(o.type * p.quantity ) as quantity,
COUNT(*) as score
FROM product AS p
LEFT JOIN order AS o
ON p.order_id = o.id
GROUP BY p.id ORDER BY quantity DESC LIMIT 30;

0 für die Antwort № 3

versuche so etwas:

 SELECT sum(case when orders.type < 0
THEN products.quantity * -1
else products.quantity end) as quantity,
products.id,
count(products.id) as score,
FROM products LEFT JOIN orders ON ( products.order_id=orders.id )
ORDER BY score DESC LIMIT 30;

SQL-Geige