2017-06-15 2 views
1

Frage: Wie heißen die einzelnen Kunden, wie viele Bestellungen haben sie aufgegeben und wie viele Pizzas haben sie bestellt? HierAggregierte SQL-Abfrage

enter image description here

ist, was ich habe:

SELECT DISTINCT FirstName, LastName, Count(Orders.ID) AS NumberOfOrders, Count(Pizza.ID) AS NumberOfPizzas 
FROM ((Customer LEFT OUTER JOIN Orders ON Customer.ID = Orders.CustomerID) LEFT OUTER JOIN Pizza ON Orders.ID = Pizza.OrderID) GROUP BY Customer.ID; 

Dies ist, was er druckt:

enter image description here

Die Anzahl der Aufträge falsch ist, sollte es 1-0 -2-1.

Wenn ich von "Orders.ID = Pizza.OrderID" zu "Pizza.OrderID = Orders.ID" umschalte, wird die Anzahl der Bestellungen für beide Spalten anstelle der Anzahl der Pizzen für beide Spalten ausgegeben.

Wie kann ich das beheben?

+0

Bitte keine Bilder verwenden; kopiere das Material in die Frage und formatiere es als "Code". Kopieren Sie das Material in die Frage und ignorieren Sie die Vorschau. Stellen Sie sicher, dass es korrekt aussieht und keine Registerkarten enthält. Wählen Sie es aus und ziehen Sie es mit der ** '{}' ** - Schaltfläche über dem Bearbeitungsfeld ein. Sehen Sie sich nun die Vorschau an und prüfen Sie, ob sie noch in Ordnung ist. Wenn Sie möchten, können Sie vor den Beispielen eine nicht eingerückte Zeile hinzufügen, die '' enthält. Ihre Screenshots sind fast unleserlich - zumindest für die Augen von Antiquitäten wie mir. –

Antwort

0

ändert es zu count(distinct orders.id)

1

Es sieht aus wie Sie eine Klasse und Lernen nehmen, also hat mich für Sie etwas mehr Feedback bekommen. Wenn Sie Tabellen zusammenfügen, empfiehlt es sich zunächst, jedes ausgewählte Feld vollständig zu qualifizieren, auch wenn es nur für eine einzelne Tabelle eindeutig ist (z. B. wird c.FirstName). Es hilft, Ihren Code selbst zu dokumentieren.

Zweitens ist es eine schlechte Übung, ein Feld mit dem gleichen Namen in mehreren Tabellen zu haben, wenn es nicht dasselbe bedeutet. Insbesondere sollte Customer.IDCustomer.CustomerID sein und Order.ID sollte Order.OrderID sein. Auch dies hilft Ihnen, nicht nur Ihre Abfragen selbst zu dokumentieren, sondern auch jeden anderen Entwickler, der nach Ihnen kommt und diese Tabellen verwenden muss. Es ist viel klarer, was genau dieses ID-Feld darstellt.

Die Joins (zumindest in MySQL) müssen nicht alle in Klammern eingeschlossen sein. Wenn Sie dies nicht tun müssen, kann dies zu frustrierenden Tippfehlern führen und macht es Ihnen und anderen schwerer zu lesen. In 99% der Fälle sollten Sie immer eine ORDER BY-Klausel in Ihrem Endprodukt verwenden, da Sie sich nie darauf verlassen können, dass das Programm Ihnen Ihre Ergebnisse zurückgibt, wie Sie es beabsichtigen. Wählen Sie etwas Logisches für den Benutzer. In diesem Fall ist die Sortierung nach Nachname und Vorname sehr intuitiv. Tu nichts, was den Benutzer verärgert!

Jetzt, auf Ihr spezifisches Problem, ist es ziemlich einfach. Sie müssen eine COUNT(DISTINCT ...) in der Abfrage verwenden. Unter Berücksichtigung all dieser Faktoren habe ich Ihre Abfrage neu geordnet, um die Lesbarkeit zu verbessern. Ich hoffe das hilft!