3

item_id ごとの購入だけでなく、合計購入数を経時的にカウントしたいと思います。この例では、ユーザーがアイテムを所有でき、これらのアイテムを他のユーザーが購入できます。所有者は自分のアイテムを購入することはできません。

私が抱えている問題は、正の整数カウントを持つ日と一緒に購入がなかった日に「0」のカウントで結果を返す方法です。

これが私のテーブルです:

      items           |          items_purchased          | numbers |   dates
i_id  item_id user_id | p_id item_id  user_id     date    |   num   | datefield
  1      1       11   |  1      1         13   2009-01-11 | 1       | 2005-06-07
  2      2       12   |  2      1         14   2009-01-11 | 2       | 2005-06-08
  3      3       11   |  3      2         15   2009-01-12 | 3       | 2005-06-09   
                      |  4      3         16   2009-01-12 | ...     | ...
                      |  5      1         17   2011-12-12 | 1000    | 2015-06-07

user_id=11のアイテムの合計購入数に対する私の MYSQL クエリは次のとおりです。

SELECT COUNT(*) as counts, DATE(purchase_date) as DATE
FROM items_purchased 
JOIN items on items_purchased.item_id=items.item_id 
WHERE items.user_id=11 
GROUP BY DATE(purchase_date)
//note this query **doesn't** make use of the numbers and dates tables b/c I don't know how to use them

結果は次のとおりです。

counts    date
  2    2009-01-11
  1    2009-01-12
  1    2011-12-12

代わりに私が見たいものは次のとおりです。

counts    date
  2    2009-01-11
  1    2009-01-12
  0    2009-01-13
  0    ... // should be a row here for each day between 2009-01-13 and 2011-12-12
  1    2011-12-12
  0    ... // should be a row here for each day between 2011-12-12 and current date
  0    current date (2012-6-27)

item_id=1所有者が制限されている購入の総数を求める MYSQL クエリは次のuser_id=11とおりです。

SELECT COUNT(*) as counts, DATE(purchase_date) as DATE
FROM items_purchased 
JOIN items on items_purchased.item_id=items.item_id 
WHERE items.user_id=11 and items.item_id=1
GROUP BY DATE(purchase_date)

結果は次のとおりです。

counts    date
  2    2009-01-11
  1    2011-12-12

上記と同様に、代わりに見たいのは次のとおりです。

counts    date
  2    2009-01-11
  0    2009-01-12
  0    ... // should be a row here for each day between 2009-01-12 and 2011-12-12
  1    2011-12-12
  0    ... // should be a row here for each day between 2011-12-12 and current date
  0    current date (2012-6-27)

numbersどういうわけか、とテーブルを組み込む必要があると思いますが、datesこれを行う方法がわかりません。どんな考えでも大歓迎です、

ありがとう、ティム

4

1 に答える 1

4

答えを訂正するために編集:

http://sqlfiddle.com/#!2/ae665/4

SELECT date_format(datefield,'%Y-%m-%d') AS DATE, IFNULL(counts, 0), item_id FROM 
    dates a
LEFT JOIN 
    (SELECT COUNT(*) as counts, purchase_date,user_id,item_id 
     FROM items_purchased 
     WHERE item_id=1
     GROUP BY date(purchase_date),item_id )r 
ON date(a.datefield) = date(r.purchase_date) ;

上記のクエリは、次の仮定に基づいています。

  1. テーブルの日付には、一覧表示する日付の範囲内にある一連の日付が含まれています。
  2. アイテムテーブルが何のためにあるのかよくわかりません。2番目のクエリは、items_purchasedテーブルのpurchase_dateとitem_idでグループ化することです。
  3. カウントとは、特定の日に購入された特定のアイテムをカウントすることです(user_idに関係なく)。

@timpeterson(OP)による更新@Selに大いに感謝します。これが私が興味を持っている両方のクエリを示すsqlfiddlesです:

  1. 1人のユーザーが所有するすべてのアイテムの1日あたりの購入数(例user_id=11:):http ://sqlfiddle.com/#!2/76c00/3
  2. item_id=1所有する購入/日user_id=11http ://sqlfiddle.com/#!2/76c00/1

リンクが何らかの理由で壊れた場合の2番目のSQLコードは次のとおりです。

SELECT date_format(datefield,'%Y-%m-%d') AS DATE, 
IFNULL(countItem, 0), item_id
FROM dates a
LEFT JOIN 
(SELECT countItem, purchase_date,i.user_id,p.item_id FROM (
   SELECT count(*) as countItem, purchase_date,user_id,item_id 
   FROM items_purchased 
   GROUP BY date(purchase_date),item_id
   ) p 
 inner join items i
 on i.item_id=p.item_id
 WHERE p.item_id='1' and i.user_id='11' //just get rid of "p.item_id='1'" to produce the 1st query result
)r 
ON date(a.datefield) = date(r.purchase_date);
于 2012-06-28T03:20:26.177 に答える