sql >> Base de Datos >  >> Database Tools >> phpMyAdmin

CONSULTA SQL EN TABLAS MÚLTIPLES

El error de sintaxis aquí es que necesita un on -cláusula para su left join . Pero el problema conceptual subyacente es diferente:no puedes join con una subconsulta dependiente .

Puede corregir su consulta de esta manera:

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;

Esto movió tu interior where -condición (que dependería de items.id , que no está permitido, ya que está fuera del alcance) al on -cláusula. Así item_id también se agrega en el interior select (ya que se necesita afuera).

Una forma diferente de escribir esto sería

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

Aquí tienes una subconsulta dependiente :el interior where -la cláusula depende del items.id externo . No necesitas un group by más, como el where -condition ya usa solo las filas para ese artículo. (Y también puede devolver como máximo una fila en este contexto de todos modos).

Ambas consultas son equivalentes y pueden (si el optimizador encuentra ese plan de ejecución) internamente ejecutarse exactamente de la misma manera (que no es nada que deba preocuparse mucho, siempre que proporcione los índices apropiados).

Entonces, en su caso, puede usar ambos (y tal vez verificar cuál es más rápido); si desea obtener información adicional para ese elemento, debe preferir la left join -versión sin embargo, p. usar

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