phpMyAdmin
 sql >> Base de données >  >> Database Tools >> phpMyAdmin

RECHERCHE SQL SUR PLUSIEURS TABLES

L'erreur de syntaxe ici est que vous avez besoin d'un on -clause pour votre left join . Mais le problème conceptuel sous-jacent est différent :vous ne pouvez pas join avec une sous-requête dépendante .

Vous pouvez corriger votre requête comme ceci :

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;

Cela a déplacé votre where intérieur -condition (qui dépendrait de items.id , ce qui n'est pas autorisé, car il est hors de portée) au on -clause. Ainsi item_id est également ajouté dans le select interne (car il est nécessaire à l'extérieur).

Une autre façon d'écrire cela serait

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

Ici, vous avez une sous-requête dépendante :le where intérieur -clause dépend du items.id externe . Vous n'avez pas besoin d'un group by plus, comme le where -condition utilise déjà uniquement les lignes de cet élément. (Et vous ne pouvez de toute façon renvoyer qu'une seule ligne au maximum dans ce contexte.)

Les deux requêtes sont équivalentes et peuvent (si l'optimiseur trouve ce plan d'exécution) être exécutées en interne exactement de la même manière (ce qui ne vous préoccupe pas beaucoup, tant que vous fournissez les index appropriés).

Donc, dans votre cas, vous pouvez utiliser les deux (et peut-être vérifier lequel est le plus rapide); si vous souhaitez obtenir des informations supplémentaires pour cet élément, vous devez préférer la left join -version cependant, par ex. utiliser

...
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;