2011-12-16 2 views
9

私はアイテムのテーブルを持っていますが、私は各アイテムの個別購入を含む別のテーブルを持っています。すべての商品が購入されたわけではありません。私は、購入数を選択し、次のような文を使用してアイテムテーブルとそれに参加しています:LEFT JOINからNULL列のデフォルト値を設定し、WHEREを使用してフィルタリングを行います

SELECT items.name, purchases_count 
FROM `items` 
    LEFT JOIN (SELECT sales.item_name, SUM(unit_sales) AS purchases_count 
     FROM sales GROUP BY item_name) sales ON sales.item_name = items.uid 

これはと同様のデータになり:

+------+-----------------+ 
| name | purchases_count | 
|------+-----------------+ 
| Shoe | 12    | 
| Belt | NULL   | 
+------+-----------------+ 

私はフィルタリングしたいときに私の問題が発生しましたこの結果はpurchases_countにあります。 WHERE purchases_count < 10などを使用すると、販売記録のない商品(つまり、NULL値の商品)は検索対象から除外されます。

NULLレコードを0に正しく設定したCOALESCE(purchases_count,0) AS purchases_countを使用しようとしましたが、WHEREを使用してもまだ表示されません。私はCOALESCEWHEREの後に起こっていると思う。

可能であれば、WHEREを使用してこの番号にフィルタをかけ、NULLの結果を(ゼロとして)含めることができます。助言がありますか?

+0

'左のalias'は、テーブルには、テーブル名と同じであることが良い方法です参加? – diEcho

+0

SQLクエリーは質問に集中するために単純化されていますが、実際のSQLはこれとは異なります。 –

答えて

7

エイリアスは、をwhere purchases_count_2 < 10としてみてください。

where COALESCE(purchases_count,0) < 10が有効です。

+0

purchases_count_2を使用することはできません。通常のpurchases_countでCOALESCEを使用するのと同じ問題です。WHERE句では認識されません。 'WHERE COALESCE(purchases_count、0)<10'は動作しますが、ここではCOALESCEをラップする必要はありません。しかし、今は最高の選択肢かもしれませんが、ありがとう。 –

+0

これはMySQLで動作するのかどうかは分かりませんが、サブクエリを使用することができます: 'select * from(select ... coalesce(purchases_count、0)as purchases_count ...)purchases_count <10' – wrschneider

1

についてどのように:もちろん

WHERE (purchases_count < 10) OR (purchases_count IS NULL) 

、あなたはまだnull値のままにされると思いますが、あなたはまだ、後の使用のためにゼロにそれらのヌルをオンにするCOALESCEオプションを試すことができます。

+0

アイデアは、これらの数値に任意のフィルタを適用することができるので、たとえば、purchases_count> 6を探しているときにNULLを返すことは望ましくありません。これは、これを使用するケースです。 –

0

COALESCEが正しい方法ですが、WHERE使用しないでください、試してみてください -

HAVING purchases_count<=10 
+0

これは完全に間違っています。 HAVINGはGROUP BYを使用する場合にのみ適用されます。 – JamieSee

+0

誰がそう言うか????? – ajreal

+1

SQL標準では、HAVINGはGROUP BY句の列または集約関数で使用される列のみを参照する必要があります。しかし、MySQLはこの振る舞いの拡張をサポートしており、HAVINGがSELECTリストのカラムと外部サブクエリのカラムを参照することを許可します。 – ajreal

0

だから、あなたはこのようなwhere句を追加することができます

WHERE purchases_count < 10 OR purchases_count is NULL 
0

をuがこの

を試してきました
SELECT items.name, IFNULL(purchases_count,0) 
FROM `items` 
LEFT JOIN (
      SELECT item_name, SUM(unit_sales) AS purchases_count 
      FROM sales GROUP BY item_name 
      ) s ON s.item_name = items.uid 
GROUP BY items.name 
HAVING purchases_count >10 
+0

これは完全に間違っています。 HAVINGはGROUP BYを使用する場合にのみ適用されます。 – JamieSee

+0

COALESCEは、最初にサブクエリ内でCOALESCEにNULLデータがゼロでないため、何も実行しません。 –

+0

'left join 'に' Group BY'があります。 – diEcho

2

別々のクエリで購入数をカウントする代わりに、代わりにメインクエリをグループ化するだけです。カウントにフィルタリングするには、having caluseでそれを置く:

select i.name, coalesce(sum(s.unit_sales), 0) as purchases_count 
from items i 
left join sales s on s.item_name = i.uid 
group by i.name 
having purchases_count < 10 
関連する問題