2016-10-10 3 views
1

Ich habe 2 Tabellen, 1 heißt menu und 1 heißt orderregel. Eine orderregel ist eine Datenbanktabelle, die in Geschäften verwendet wird, um bestimmte Produkte und die Menge zu speichern.SQL innere Verbindung wählen Feldliste

Ich habe dies für Menüs in einem Restaurant, die Leute können verschiedene Menüs bestellen und sie bekommen alle ihre eigenen Bestellregeln, die dann zu einer Bestellung hinzugefügt werden, die Sie am Ende bezahlen.

Also ich möchte die Menüs sehen, die pro Tabelle ausgewählt sind und die Menge, die sie ausgewählt werden.

Hier sind die zwei Tabellen:

|---------------------|-------------------------| 
|  Menu   |  Orderregel  | 
|---------------------|-------------------------| 
| ID |  Name  | ID | Quantity | Menu_id | 
|---------------------|-------------------------| 
| 1 | Menu One | 1 |  3 | 1 | 
| 2 | Menu two | 2 |  2 | 1 | 
| 3 | Menu Three | 3 |  4 | 3 | 
|---------------------|-------------------------| 

Und mit einer SQL-Abfrage, die ich dieses Ergebnis erhalten möchten:

|---------------------| 
| Result of query | 
|---------------------| 
| Menu Name|Quantity | 
|---------------------| 
| Menu One | 5  | 
| Menu Two | 0  | 
|Menu Three| 4  | 
|---------------------| 

Die SQL-Abfrage Ich habe zur Zeit ist:

SELECT SUM(orderregel.aantal) AS Aantal 
FROM `orderregel` 
WHERE menu_id IS NOT null 
GROUP BY menu_id 

Welches gibt mir dieses Ergebnis

|---------------------| 
| Result of query | 
|---------------------| 
|  Quantity  | 
|---------------------| 
|   5   | 
|   4   | 
|---------------------| 

Ich versuche jetzt herauszufinden, eine Abfrage, die den Namen und die Menge erhalten wird, wie in der obigen Tabelle gezeigt. Was ich versucht ist, dies zu tun:

SELECT menu.naam, quantity.aantal 
FROM `menu` 
INNER JOIN 
    (SELECT sum(orderregel.aantal) AS aantal 
    FROM orderregel 
    WHERE menu_id IS NOT null 
    GROUP BY menu_id) AS quantity 

Aber diese Abfrage gibt mir in eine seltsame Art und Weise dupliziert, wie folgt aus:

|---------------------| 
| Result of query | 
|---------------------| 
| Menu Name|Quantity | 
|---------------------| 
| Menu One | 5  | 
| Menu Two | 0  | 
|Menu Three| 5  | 
| Menu One | 4  | 
| Menu Two | 0  | 
|Menu Three| 4  | 
|---------------------| 

Haben Sie eine Lösung? Dank

EDIT 1 habe ich vergessen, ich MySQL verwenden zu erwähnen, und ich versuchte, JOIN LEFT und OUTER JOIN, die sowohl die erro 1062

EDIT 2

SELECT menu.naam as 'Menu naam', sum(orderregel.aantal) as Aantal 
FROM `menu` 
LEFT JOIN orderregel on menu.id = orderregel. menu_id 
WHERE order_id = '57' 
GROUP BY menu_id 

die order_id geben = '57' wird in meinem Code in eine Variable geändert, die auf dem ausgewählten Auftrag/Kunden basiert. Danke Jungs für die Hilfe

Antwort

2

Mit Blick auf Ihre Tabellen, die Sie nur eine Auswahl mit Gruppe permform sollte

SELECT menu.name, sum(orderregel.quantity) as quantity 
    FROM `menu` 
    INNER JOIN orderregel 
    on menu.menu_id = orderregel. menu_id 
    group by menu_id 

oder wenn die Join-Klausel nicht immer matc ist h benutze Linksbündel

SELECT menu.name, sum(orderregel.quantity) as quantity 
    FROM `menu` 
    LEFT JOIN orderregel 
    on menu.menu_id = orderregel. menu_id 
    group by menu_id 
+1

Der Schlüssel ist der "äußere Join" ... (Ich habe Sie nicht downvote) – sgeddes

+0

@sgeddes. nur die Zeit für den Abschluss der asnwer .. – scaisEdge

2

Verwenden Sie ein outer join statt:

select m.id, m.name, coalesce(sum(o.quantity),0) as quantity 
from menu m 
    left join orderregel o on m.id = o.menu_id 
group by m.id, m.name 
+0

@ danny117 - die 'summe' von' null' ist 'null', nicht' 0'. Deshalb habe ich 'coalesce' verwendet ... Sieh diese Geige: http://sqlfiddle.com/#!9/edf0d/1 – sgeddes

+0

Ah ich sehe, aber meine Quantität hat einen NOT NULL in der Datenbank also ist es immer 0. Dort sind auch Einschränkungen in dem Code, der eine 1 oder eine höhere Menge –

+0

@GertjanBrouwer - führen Sie es ohne die "Koaleszenz" und die 'Summe' wird' null' zurückgeben ... es spielt keine Rolle, dass es ein 'nicht null ist 'constraint, die' summe' von no records ist 'null', nicht' 0'. der Schlüssel ist jedoch die "äußere Verbindung". – sgeddes

1

Ich denke, eine linke Verbindung würde erreichen, was Sie brauchen. Linker Join gibt alle Zeilen der linken (ersten) Tabelle aus.

SELECT menu.id, menu.naam, SUM(orderregel.aantal) AS Aantal 
FROM `menu` 
LEFT OUTER JOIN `orderregel` on menu.id = orderregel.menu_id 
WHERE menu_id IS NOT null 
GROUP BY menu.id, menu.naam 

P.S. Ich schätze, in Wirklichkeit wirst du das auch auf den Kunden beschränken wollen, sonst bekommst du einfach die Anzahl der Menüs, die jeder im Restaurant bestellt hat.

+0

Yeh wahr, ich will es von Kunden, aber ich kann diesen Teil selbst tun, denke ich –

0
select name,sum(quantity) as quantity 
from 
Menu join Orderrege1 as O 
on menu.ID = O.menu_id group by Menu.Name