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 № 1Dadurch 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;