2012-08-22 16 views
5

tengo el siguiente, trabajando consulta MySQL:condicional instrucción de combinación en MySQL

SELECT 
    a.id id, 
    a.price price, 
    a.stock stock, 
    a.max_per_user max_per_user, 
    a.purchased purchased, 
    b.quantity owned 
FROM 
    shop_items a 
     JOIN shop_inventory b 
      ON b.iid=a.id 
      AND b.cid=a.cid 
WHERE 
    a.cid=1 
    AND a.szbid=0 
    AND a.id IN(3,4) 

El JOIN se une a la mesa de shop_inventory b para volver b.quantity owned. Sin embargo, si no hay ningún registro en la tabla shop_inventory b donde b.iid=a.id quiero que devuelva b.quantity = 0. ¿Cómo haría esto?

Respuesta

9

Uso LEFT JOIN lugar. Y COALESCE ya que algunos de los registros son nulos (supongo). Intente,

SELECT a.id id,a.price price,a.stock stock, 
     a.max_per_user max_per_user,a.purchased purchased, 
     COALESCE(b.quantity, 0) owned 
FROM shop_items a 
      LEFT JOIN shop_inventory b 
       ON b.iid=a.id AND b.cid=a.cid 
WHERE a.cid=1 AND 
     a.szbid=0 AND 
     a.id IN(3,4) 
+1

+1 para 'COALESCE'. –

+0

gracias, muy apreciado :) –

+1

Gracias, he incorporado la idea de Thomas de 'GROUP BY', y sumando cantidades individuales, y usé su' COALESCE' para valores 'NULL' :). –

3

Algo como esto debería hacer el truco.

SELECT a.id id,a.price price,a.stock stock, 
     a.max_per_user max_per_user,a.purchased purchased, 
     COUNT(b.quantity) AS owned 
FROM shop_items a 
      LEFT JOIN shop_inventory b 
       ON b.iid=a.id AND b.cid=a.cid 
WHERE a.cid=1 AND a.szbid=0 AND a.id IN(3,4) 
GROUP BY id 
+0

Gracias por la idea de utilizar 'GROUP BY ', se modificó ligeramente usando' SUM (COALESCE (b.quantity, 0)) 'en su lugar :). –

+0

Sí, SUM (CALESCE()) probablemente esté más en línea con lo que necesita. Me alegro de que la idea sea de alguna ayuda. :-) – Thomas

3

que desee utilizar un LEFT JOIN en lugar de un JOIN.

SELECT a.id id,a.price price,a.stock stock, 
     a.max_per_user max_per_user,a.purchased purchased, 
     b.quantity owned 
FROM shop_items a 
LEFT JOIN shop_inventory b ON b.iid=a.id AND b.cid=a.cid 
WHERE a.cid=1 AND a.szbid=0 AND a.id IN(3,4) 

Esto hará que los campos en b NULL si no coinciden con la cláusula ON.

Si usted quiere que sea 0, puede utilizar IFNULL

SELECT IFNULL(b.quantity, 0) owned 
2

Aquí podría usar Left Join y Group By. Si todo lo que necesita es el recuento de elementos de b, es decir.

SELECT a.id id,a.price price,a.stock stock, 
     a.max_per_user max_per_user,a.purchased purchased, 
     COUNT(b.quantity owned) as quantity_owned 
FROM shop_items a 
      LEFT JOIN shop_inventory b 
       ON b.iid=a.id AND b.cid=a.cid 
WHERE a.cid=1 AND a.szbid=0 AND a.id IN(3,4) 
GROUP BY a.id 
Cuestiones relacionadas