-3

特定のデータを含む2つのテーブルがあります。

users:
+----+------------+
| id |  username  |
+----+------------+
| 1  |    rob     |
| 2  |    john    |
| 3  |    jane    | <--- jane never has donated
+----+------------+

donations:
+--------------------+------------+
|   uid   |  amount  |   date     |
+---------+----------+------------+
|    1    |    20    | 2013-10-10 | 
|    2    |    5     | 2013-10-03 | 
|    2    |    50    | 2013-09-25 |
|    2    |    5     | 2013-10-01 |
+---------+----------+------------+


Result I want:
+---------+-------------+---------+-------------+
|    id   |   username  | amount  |   monthly   | <- sum of donations this month
+---------+-------------+---------+-------------+
|    1    |     rob     |   20    |      1      |
|    2    |     john    |   60    |      3      |
|    3    |     jane    |   0     |      0      | <- jane added
+---------+-------------+-----------------------+

これは私のクエリです:

SELECT t1.*, sum(t2.amount) amount, count(*) as monthly
FROM users t1
inner join donations t2
  on t2.uid = t1.id
group by t1.username

編集:ジェーンを追加するのを忘れました、彼は寄付したことがありません.

どうすればこれを行うことができますか?

4

3 に答える 3

1

結果で 9 月のレコードを除外していないため、出力は間違っています (2013 年 10 月のみを考慮する必要があります)。

期待される出力は次のようになります。

| ID | USERNAME | AMOUNT | MONTHLY |
|----|----------|--------|---------|
|  1 |      rob |     20 |       1 |
|  2 |     john |     10 |       2 |
|  3 |     jane |      0 |       0 |

出力を取得するクエリは次のとおりです。

SELECT
  u.id,
  u.username,
  COALESCE(sum(d.amount), 0) amount,
  COUNT(d.uid) monthly
FROM users u
LEFT JOIN donations d
  ON u.id = d.uid
    AND (month(d.date), year(d.date)) = (month(CURDATE()), year(CURDATE()))
GROUP BY u.id

users.ID一意の値が保持されていると仮定するとu.id、そうでないかのようにグループを離れることができ、グループ化する必要がありますu.id, u.username

ここでフィドル。

于 2013-10-25T21:06:16.327 に答える
0
SELECT t1.*, sum(t2.amount) as amount, count(t2.amount,t2.`date`) as monthly
FROM users t1
inner join donations t2
  on t2.uid = t1.id
where month(t2.`date`)=month(curdate()) and year(t2.`date`)=year(curdate())
group by t1.username
于 2013-10-25T20:44:55.853 に答える