5

私は次の、動作する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テーブルを結合してshop_inventory bを返しb.quantity ownedます。ただし、shop_inventory bテーブルb.iid=a.idに返してほしいレコードがない場合b.quantity = 0。どうすればいいですか?

4

4 に答える 4

9

LEFT JOIN代わりに使用してください。そしてCOALESCE、いくつかのレコードがnullであるため(私は推測します)。試す、

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)
于 2012-08-22T13:52:38.160 に答える
3

このような何かがトリックを行う必要があります。

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
于 2012-08-22T13:52:25.460 に答える
3

LEFT JOINの代わりにを使用したい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)

これにより、フィールドが句bと一致しない場合、フィールドはNULLになります。ON

あなたがそれをしたいなら0、あなたは使うことができますIFNULL

SELECT IFNULL(b.quantity, 0) owned
于 2012-08-22T13:52:36.467 に答える
2

これは、左結合とグループ化を使用する場所です。必要なのがbからのアイテムの数だけである場合、つまり。

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
于 2012-08-22T13:54:04.220 に答える