2011-06-23 10 views
2

私のカウント結果を特定の条件を満たすものに限定しようとしています。私は現在WHERE句を使用しており、出力は期待通りです。ここで日付の比較に基づくCOUNT()およびHAVING付きのMySQLクエリ

私の現在のクエリで、あなたが見ることができるように私recdateは14日のマークを満たしているWHERE場合* ads_list *と* ads_cate *レコードが唯一のフェッチ次のようになります。

$queryCats = " 
SELECT ads_cate.cateName, COUNT(ads_list.Title) 
FROM 
ads_cate 
JOIN ads_list ON ads_cate.id = ads_list.category 
WHERE to_days(now())<=(to_days(recdate)+14) 
GROUP BY ads_cate.cateName"; 

私はすべてをしたいと思いますカテゴリや広告は検索されますが、WHERE句の条件を満たす場合にのみカウントされます。私はHAVINGを以下のように0運に使っています。たぶん良い方法がありますか?

$queryCats = " 
SELECT ads_cate.cateName, ads_list.recdate, COUNT(ads_list.Title) 
FROM 
ads_cate 
JOIN ads_list ON ads_cate.id = ads_list.category 
GROUP BY ads_cate.cateName 
HAVING to_days(now())<=(to_days(recdate)+14)"; 
+0

をあなたの最初のクエリでは、すでに – dynamic

+0

がどのテーブル 'recdate'はに属しないことですか? –

+0

問題は私のカテゴリが私の結果セットに表示される配列にないことです。それらはフィルタリングされています。私はそれらの基準を満たしているかどうかにかかわらず、私の配列で利用可能なすべてのカテゴリ名が必要です。 – OldWest

答えて

3

LEFT JOINを使用して試してみて、結合条件の日付のテスト部分を作る:

SELECT ac.cateName, COUNT(al.Title) 
    FROM ads_cate ac 
     LEFT JOIN ads_list al 
      ON ac.id = al.category 
       AND to_days(now())<=(to_days(al.recdate)+14) 
    GROUP BY ac.cateName 
+0

Joe、あなたのサンプルは魔法です。私はアルを推測しています。あなたのプレゼンテーションとアプローチは私のような新しいものです。私はal.Title(al部分)がそのエイリアスのテーブルを割り当てていると推測しています。面白いコードをありがとう。 – OldWest

+0

あなたは正しいと推測しました。 'al'エイリアスは、クエリを通して' ads_list'テーブルを参照する簡単な方法です。エイリアスは、コードのLEFT JOIN ads_list al部分の間にテーブルが参照されるときに実際に割り当てられます。 –

+0

「ads_list al」の断片の意味を理解しています。参考になったレッスンをありがとう。 – OldWest

0

は、サブクエリにカテゴリテーブルからサブクエリであなたのフィルターカウントを入れた後、LEFT JOIN

1

これは動作可能性があります

SELECT ads_cate.cateName, ads_list.recdate, COUNT(CASE WHEN to_days(now())<=to_days((recdate)+14) THEN ads_list.Title ELSE NULL END) AS Title 
FROM 
ads_cate 
JOIN ads_list ON ads_cate.id = ads_list.category 
GROUP BY ads_cate.cateName 
+0

'ELSE NULL'ではなく' ELSE NULL'を試してください。なぜなら 'COUNT()'は 'NULL'でないものをすべてカウントするからです。 –

+0

@ypercubeそれを指摘してくれてありがとう。上記のクエリを編集しました。 –