phpMyAdmin
 sql >> Base de Dados >  >> Database Tools >> phpMyAdmin

CONSULTA SQL EM MÚLTIPLAS TABELAS


O erro de sintaxe aqui é que você precisa de um on -clause para sua left join . Mas o problema conceitual subjacente é diferente:você não pode join com uma subconsulta dependente .

Você pode corrigir sua consulta assim:
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;

Isso moveu seu where interno -condition (que dependeria de items.id , o que não é permitido, pois está fora do escopo) para o on -cláusula. Assim, item_id também é adicionado no select interno (como é necessário fora).

Uma maneira diferente de escrever isso seria
select items.*, 
   (select sum(purchase_details.quantity) 
    from purchase_details 
    where purchase_details.item_id=items.id) as total
from items;

Aqui você tem uma subconsulta dependente :o where interno -clause depende do items.id externo . Você não precisa de um group by mais, como o where -condition já usa apenas as linhas desse item. (E você também só pode retornar no máximo uma linha neste contexto.)

Ambas as consultas são equivalentes e podem (se o otimizador encontrar esse plano de execução) internamente ser executada exatamente da mesma maneira (o que não é nada com que você precise se preocupar muito, desde que você forneça índices apropriados).

Então, no seu caso, você pode usar os dois (e talvez verificar qual deles é mais rápido); se você quiser obter informações adicionais para esse item, você deve preferir a left join -versão, por exemplo, 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;