phpMyAdmin
 sql >> Datenbank >  >> Database Tools >> phpMyAdmin

SQL-ABFRAGE AUF MEHREREN TABELLEN

Der Syntaxfehler hier ist, dass Sie einen on benötigen -Klausel für Ihren left join . Aber das zugrunde liegende konzeptionelle Problem ist anders:Sie können nicht join mit einer abhängigen Unterabfrage .

Sie können Ihre Abfrage wie folgt korrigieren:

select items.* 
from items 
LEFT OUTER JOIN (
  select item_id, sum(purchase_details.quantity) as total
  from purchase_details 
  GROUP BY purchase_details.item_id
) ABC on ABC.item_id = items.id;

Dies hat Ihr inneres where verschoben -condition (das würde von items.id abhängen , was nicht erlaubt ist, da es außerhalb des Gültigkeitsbereichs liegt) an on -Klausel. Also item_id wird auch im inneren select hinzugefügt (wie es draußen benötigt wird).

Eine andere Schreibweise wäre

select items.*, 
   (select sum(purchase_details.quantity) 
    from purchase_details 
    where purchase_details.item_id=items.id) as total
from items;

Hier haben Sie eine abhängige Unterabfrage :das innere where -Klausel hängt von der äußeren items.id ab . Sie benötigen kein group by nicht mehr als where -condition verwendet bereits nur die Zeilen für dieses Element. (Und Sie können in diesem Kontext sowieso nur höchstens eine Zeile zurückgeben.)

Beide Abfragen sind äquivalent und können (wenn der Optimierer diesen Ausführungsplan findet) intern tatsächlich auf genau die gleiche Weise ausgeführt werden (worum Sie sich jedoch nicht viel kümmern müssen, solange Sie geeignete Indizes bereitstellen).

In Ihrem Fall können Sie also beide verwenden (und vielleicht prüfen, welches schneller ist); wenn Sie zusätzliche Informationen zu diesem Artikel erhalten möchten, sollten Sie den left join bevorzugen -Version aber, z.B. verwenden

...
LEFT OUTER JOIN (
  select item_id, 
    sum(purchase_details.quantity) as total,
    count(purchase_details.item_id) as cnt,
    max(purchase_details.quantity) as max_quantity_per_order,
    max(purchase_details.date) as latest_order,
    ...
  from purchase_details 
  GROUP BY purchase_details.item_id
) ABC on ABC.item_id = items.id;