【发布时间】:2012-01-27 04:58:52
【问题描述】:
我有(再次)这个表:
User:
id | name
-------------
1 | 'John'
2 | 'Peter'
3 | 'Luke'
Accounts:
id | userid | amount | date
--------------------------
1 | 1 | 1000 | '2012-01-26'
2 | 1 | 2000 | '2011-12-25'
3 | 1 | 1000 | '2012-01-25'
4 | 2 | 1500 | '2012-01-15'
5 | 3 | 2500 | '2011-11-30'
我需要收集数据,所以我同时有一个包含用户的结果集,每个用户的帐户数,每个用户的帐户金额总和,以及每个用户的帐户,但仅限于当前年份的日期...
类似这样的:
Some-query:
UserName | CountAccts | SumAccts | CountAcctsThisYear
-----------------------------------------------------
'John' | 3 | 4000 | 2
'Peter' | 1 | 1500 | 1
'Luke' | 1 | 2500 | 0
我设法通过此查询获得前 3 列:
SELECT u.name as Username,
COUNT(a.id) as CountAccts,
SUM(a.amount) as SumAccts
FROM User u
LEFT JOIN Accounts a ON u.id = a.userid
GROUP BY u.id;
另外,我可以用另一个得到第一列和最后一列:
SELECT u.name as Username,
COUNT(acctsthisyear.id) as CountAcctsThisYear
FROM User u
LEFT JOIN (SELECT a.id
FROM Accounts a
WHERE DATE_FORMAT(a.date,'%Y') = DATE_FORMAT(CURDATE(),'%Y')
) AS acctsthisyear ON u.id = acctsthisyear.userid
GROUP BY u.id;
但是,问题来了,我无法设法以这样的方式使用这两个查询来获得我期望的最终结果......
我有... - 尝试将 Accounts 表和 acctsthisyear 子查询与 User 表左连接(按 us.id 字段分组),但我得到的只是这样的:
UserName | CountAccts | SumAccts | CountAcctsThisYear
-----------------------------------------------------
'John' | 6 | 6000 | 6
'Peter' | 1 | 1500 | 1
'Luke' | 0 | 0 | 0
(不记得所有细节,但问题是,例如,CountAcctsThisyear 中 'John' 的 2 个结果在结果中也出现了重复,并且所有的都被相乘了......)
- 尝试将每个查询作为子查询: 选择 * 从 (也选择了 u.id 作为 ufid 的第一个查询)AS 优先, (也选择了以 u.id 作为 usid 的第二个查询)作为第二个 按 ufid、usid 分组
得到了这样的东西:
UserName | CountAccts | SumAccts | CountAcctsThisYear
-----------------------------------------------------
'John' | 3 | 4000 | 2
'Peter' | 1 | 1500 | 2
'Luke' | 1 | 2500 | 2
'John' | 3 | 4000 | 1
'Peter' | 1 | 1500 | 1
'Luke' | 1 | 2500 | 1
'John' | 3 | 4000 | 0
'Peter' | 1 | 1500 | 0
'Luke' | 1 | 2500 | 0
(如果我反转 Group by 元素,我得到的都是相同的,但按不同的顺序分组......)
任何方式......就是这样......关于什么是实现我正在寻找的正确方法的任何想法?我对此感到非常沮丧,因为我真的不是 SQL 专家,尤其是联接方面的专家:-/
【问题讨论】:
标签: mysql sql select join one-to-many