2016-12-19 8 views
2

Ich habe zwei Tabellen:SUM in LEFT JOIN Abfrage

Table products 
ID Name   Base  
1  Product_1 5 
2  Product_2 4 

Table orders 
ID Product_ID  
1  1    
2  1   
3  2 

ich diese Abfrage bin mit:

SELECT products.ID, products.Base, COUNT(orders.ID) AS Counter 
FROM products 
LEFT JOIN orders ON products.ID = orders.Product_ID 
GROUP BY products.ID 

zu erhalten:

ID Base Counter 
1  5  2 
2  4  1 

Was ich jetzt tun will ist, eine Abfrage zu schreiben, die eine Tabelle wie oben, aber mit extra Spalte SUM - Summe von Base und Counter zurückgibt:

ID Base Counter SUM 
1  5  2   7 
2  4  1   5 

Ist es möglich, dieses Ergebnis mit einer einzigen Abfrage zu erreichen? Ich möchte auch meine Ergebnisse nach SUM-Spalte bestellen.

+1

Fügen Sie ', products.Base + COUNT (orders.ID) als Summe' nach 'As counter' hinzu, wenn wir annehmen können, dass products.base numerisch ist und dann' ORDER BY Sum' nach der 'GROUP BY' – xQbert

+0

@xQbert Danke, es ist genau das, was ich brauchte! – bloo79

Antwort

3

Nicht überdenken. Fügen Sie sie einfach zusammen mit einem Pluszeichen hinzu.

SELECT products.ID, products.Base, COUNT(orders.ID) AS Counter, 
products.Base + COUNT(orders.ID) as `SUM` 
FROM products 
LEFT JOIN orders ON products.ID = orders.Product_ID 
GROUP BY products.ID 
ORDER BY `SUM` 

Hinweis: „SUM“ ist der Name eines Aggregats SQL-Funktion, so dass Sie es in Backticks, um zu umgeben benötigen es als Spalte Alias ​​zu verwenden. Überlegen Sie, einen anderen Namen zu verwenden.

1
SELECT products.ID, products.Base, COUNT(orders.ID) AS Counter, products.Base + COUNT(orders.ID) as `sum` 
FROM products 
LEFT JOIN orders ON products.ID = orders.Product_ID 
GROUP BY products.ID, products.Base 
ORDER BY `sum` DESC 

Schließen Sie immer ALLE nicht aggregierenden Spalten in die group by-Klausel ein. Siehe https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html

Wie Sie in dieser Referenz sehen werden, hat MySQL eine Nicht-Standard-Erweiterung für die Gruppe, die eine entspannte Abfragesyntax ermöglicht. Die Ergebnisse beruhen jedoch darauf, dass MySQL willkürliche Entscheidungen trifft, um die Gruppierungen zu erreichen. Wenn die Einstellung ONLY_FULL_GROUP_BY zu irgendeinem Zeitpunkt geändert wird, wenn Sie den SQL-Syntaxregeln folgen, bleibt Ihre Abfrage gültig, wenn Sie alle nicht aggregierenden Spalten in die Gruppierung nach Klausel einschließen.

+1

Generell würde ich zustimmen, aber als products.Id scheint, ein Primärschlüssel basierend auf dem Join zu Bestellungen und Beispieldaten zu sein, products.base kann nur 1 Wert haben. In diesem Fall spielt die Erweiterung von mySQL wirklich keine Rolle. Da es immer nur einen Wert gibt, aus dem man auswählen kann. Dies ist jedoch eine Annahme, dass ID ein Primärschlüssel ist. pro Link, "der Server ist frei, jeden Wert aus jeder Gruppe zu wählen. Wenn sie also nicht gleich sind, sind die gewählten Werte unbestimmt." Wenn es nur 1 Wert gibt, muss sie 1 wählen . In diesem Fall kann die Gruppierung nicht schneller sein. – xQbert

+0

Auch wenn der Primärschlüssel, wenn der Einstellungswert geändert wird, kann die Abfrage fehlschlagen. Ich bin also der festen Überzeugung, dass es immer einen guten Rat zu diesem Thema gibt. –