2016-08-17 7 views
1

(更新)
私のような2つのテーブルを持っているsubscribers存在しない日付を含む所定範囲内のすべての日付のためになりなさい

以下:

id | service_id | subscribe_date 

1 | 1   | 2016-08-10 
2 | 2   | 2016-08-09 
3 | 2   | 2016-08-05 
4 | 1   | 2016-08-03 

services

id | service_name 

1 | test1   
2 | test2 
3 | test2 

subscribers.service_idには、外部キーがあります。services.id

私は以下のように、このテーブルからデータを取得したい:

SELECT COUNT(*), subscribe_date, service_id 
FROM subscribers 
    INNER JOIN services ON subscribers.service_id = services.id 
WHERE subscribe_date BETWEEN '2016-08-09' AND '2016-08-10' 
GROUP BY service_id, subscribe_date; 

しかし、私は成功していないです:私は、クエリ以下に、このデータを取得しようと

service_id | subscribe_date | count 

1  | 2016-08-10  | 1 
1  | 2016-08-09  | 0 
2  | 2016-08-10  | 0 
2  | 2016-08-09  | 1 
3  | 2016-08-10  | 0 
3  | 2016-08-09  | 0 

。私は以下の結果が得られます。

1  | 2016-08-10  | 1 
2  | 2016-08-09  | 1 
+1

期待される出力を教えてください。 – 1000111

+0

出力は、特別な日付の各サービス購読数を表示する必要があります。原因は – Ali

+0

です。あなたが 'calendar'テーブルから助けを借りなければ、それはできません。しかし、これを行うことは間違いなくあなたのコードの美しさを悪化させるでしょう。アプリケーションレベルでこれを行う方がよい。 – 1000111

答えて

1

あなたが行く:

我々は、クエリを通して、あなたの指定した日付の範囲(両端を含む)の間のすべての日付を作成する必要があるように、すべてのcalendarテーブルを持っていないので。しかし、私はあなたがそれを使用する前にこのクエリのterms & conditionsに同意する必要があると言ったように。

SELECT 
dateWiseServices.id AS service_id, 
dateWiseServices.`Day` AS subscribed_date, 
COALESCE(yourQuery.total,0) AS cnt 

FROM 
(
    SELECT 
    S.id, 
    dateTable.Day 
    FROM 
    (
    SELECT ADDDATE('2016-08-09', INTERVAL @i:[email protected]+1 DAY) AS DAY 
    FROM (
    SELECT a.a 
    FROM (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS a 
    CROSS JOIN (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS b 
    CROSS JOIN (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS c 
    ) a 
    JOIN (SELECT @i := -1) r1 
    WHERE 
    @i < DATEDIFF('2016-08-10', '2016-08-09') 
    ) AS dateTable 
    CROSS JOIN Services S 
) AS dateWiseServices 

LEFT JOIN 
(
    SELECT COUNT(*) AS total, subscribe_date, service_id 
    FROM subscribers 
      INNER JOIN services ON subscribers.service_id = services.id 
    WHERE subscribe_date BETWEEN '2016-08-09' AND '2016-08-10' 
    GROUP BY service_id, subscribe_date 
) AS yourQuery 
ON dateWiseServices.id = yourQuery.service_id AND dateWiseServices.`Day` = yourQuery.subscribe_date 
ORDER BY dateWiseServices.id, dateWiseServices.`Day` DESC 
+0

ありがとう:) ちょうど私がカレンダーテーブルを持っている場合、私はこれを行う必要があります方法を学ぶために? – Ali

+0

完全な答えが広すぎるでしょう! :)私は別の質問として投稿することを提案します。 – 1000111

+0

私はどのようにチャットできますか?これは可能ですか? – Ali

0

代わりに、内部の使用に参加するには、

SELECT COUNT(*), subscribe_date, service_id 
FROM subscribers LEFT JOIN services ON subscribers.service_id = services.id 
GROUP BY service_id,subscribe_date; 
+0

OPは数が0の行を追加したい。LEFT JOINは役に立たない。 – jarlh

+0

ありがとうございましたが、役に立たなかった – Ali

0

に参加左かをチェックしようとする場合には

SELECT service_id,subscribe_date,COUNT(service_id) 
FROM subscribers WHERE subscribe_date BETWEEN '2016-08-09' AND '2016-08-10' 
GROUP BY service_id, subscribe_date; 

..私は、これはあなたを助けることを願って、これを試してみてください外部キーも以下のクエリを試してみてください。ここで

SELECT subscribers.service_id,subscribers.subscribe_date,COUNT(subscribers.service_id) 
FROM subscribers,services WHERE subscribers.service_id=services.id 
AND subscribe_date BETWEEN '2016-08-09' AND '2016-08-10' GROUP BY service_id, subscribe_date; 
関連する問題