2012-08-22 20 views
5

Mam następujący, pracując zapytanie MySQL:Warunkowe JOIN w 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) 

JOIN dołącza tabelę shop_inventory b wrócić b.quantity owned. Jednakże, jeśli nie ma rekordu w tabeli , gdzie b.iid=a.id chcę, aby zwrócił b.quantity = 0. Jak to zrobić?

Odpowiedz

9

Zastosowanie LEFT JOIN zamiast. I COALESCE od niektórych rekordów gdzie null (I guess). Wypróbuj,

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 dla 'COALESCE'. –

+0

dziękuję, bardzo doceniam :) –

+1

Dzięki, włączyłem pomysł Thomasa "GROUP BY" i zsumowałem poszczególne ilości, i użyłem twojego 'COALESCE' dla wartości' NULL' :). –

3

Coś takiego powinno wystarczyć.

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

Dzięki za pomysł użycia 'GROUP BY', nieznacznie zmodyfikowałem go za pomocą' SUMA (COALESCE (b.quantity, 0)) zamiast tego :). –

+0

Tak, SUMA (CALESCE()) jest prawdopodobnie bardziej zgodna z potrzebnymi. Cieszę się, że pomysł jest nieco pomocny. :-) – Thomas

3

chcesz użyć LEFT JOIN zamiast 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) 

To sprawi pól b NULL jeśli nie pasują do klauzuli ON.

Jeśli ma to być 0, można użyć IFNULL

SELECT IFNULL(b.quantity, 0) owned 
2

To będzie miejsce, w którym używasz Left Join i Group By. Jeśli wszystko, czego potrzebujesz, to liczba przedmiotów z b, to znaczy.

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