2011-02-13 18 views
8

Tengo un problema con una consulta que muestra una lista de tiendas con la cantidad de productos asociados. He estado jugando con combinaciones de izquierda, etc. durante bastante tiempo, pero fue en vano. Las tablas tienen las siguientes estructuras:Conteo() y problema de combinación a la izquierda

mesa

Tiendas columnas que contienen: id, name

productos tabla que contiene columnas: id, name, status, shop

La consulta es la siguiente:

select s.name 
     , p.name 
     , count(p.id) 
from Product as p 
     left join Shop as s on p.shop=s.id 
where p.status <> '8796107276379' 
group by 
     s.id 

No obtengo las tiendas que tienen 0 productos. ¿Cómo puedo lograr esto por favor?

La base de datos subyacente es MySQL.

Gracias! Krt_Malta

+0

intentan reemplazar la derecha unirse, en lugar dejó –

+1

No, no funciona a cabo. Me sale el siguiente error: no puedo encontrar el tipo (visible) para el alias s dentro de [p: product, s right: Shop]. (Es un lenguaje de consulta patentado) –

Respuesta

21

Necesita SHOP en el lado IZQUIERDO, ya que el lado derecho es el que puede no tener datos, en este caso PRODUCTO.

No solo eso, necesita la condición WHERE como una condición LEFT-JOIN ON, para que se una a los productos en condición de estado y simplemente haga descuentos en el producto (mientras mantiene el comercio) incluso si el estado no es deseado.

select s.name 
     , p.name 
     , count(p.id) 
from Shop as s 
     left join Product as p on p.shop=s.id AND p.status <> '8796107276379' 
group by 
     s.id, p.name 
+0

Funcionó :) ¡Gracias! –

+1

Encontré muchos aprox en línea. Esta es la mejor solución. Gracias por preguntar y responder. – helpse

0

Debe agregar OR p.status IS NULL a su cláusula where.

select s.name, p.name, count(p.id) 
from Shop s 
left join Product p on p.shop = s.id 
where (p.status <> '8796107276379' OR p.status IS NULL) 
group by s.name, p.name 
+0

No, no funcionó. ¿Por qué crees que debería funcionar con p.status IS NULL? –

+0

Dijiste que tu consulta no devuelve tiendas sin ningún producto. Sin "OR p.status IS NULL", su cláusula where excluirá todos esos casos, porque la comparación "NULL <> '8796107276379'" nunca es verdadera. NULL no es igual a nada (incluso otro NULL), ni tampoco es igual a nada. – Tommi

1
select s.name 
     , p.name 
     , count(p.id) 
from Shop as s 
     left join Product as p on s.id=p.shop 
where p.status <> '8796107276379' 
group by 
     s.id 
0

que sufrieron este gotcha también y aunque no estoy del todo seguro de por qué, colocando el predicado en la jojn sí en lugar de la consulta principal real es la forma de resolverlo.

De hecho, documenté todo, antes de leer esto. He utilizado un ejemplo sencillo con dos dos mesas pequeñas, que explica la diferencia espero, tal vez va a ayudar a

http://simpleritsolutions.com/sql/left/join/problems

+1

En lugar de dejar un enlace, ¿podría publicar también el material relevante del artículo? De lo contrario, el enlace podría convertirse en una víctima de la podredumbre de enlace – DeadChex

Cuestiones relacionadas