Mysql 多个表(一个是子查询)联接

Mysql 多个表(一个是子查询)联接,mysql,sql,select,join,one-to-many,Mysql,Sql,Select,Join,One To Many,我(再次)有以下表格: 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-2

我(再次)有以下表格:

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
UserName | CountAccts | SumAccts | CountAcctsThisYear
-----------------------------------------------------
'John'   | 6          | 6000     | 6
'Peter'  | 1          | 1500     | 1
'Luke'   | 0          | 0        | 0
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
我通过此查询获得了前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表和AcctsThiseyear子查询与User表左联接(按us.id字段分组),但得到的结果如下:

Some-query:
UserName | CountAccts | SumAccts | CountAcctsThisYear
-----------------------------------------------------
'John'   | 3          | 4000     | 2
'Peter'  | 1          | 1500     | 1
'Luke'   | 1          | 2500     | 0
UserName | CountAccts | SumAccts | CountAcctsThisYear
-----------------------------------------------------
'John'   | 6          | 6000     | 6
'Peter'  | 1          | 1500     | 1
'Luke'   | 0          | 0        | 0
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
(记不清所有细节,但问题是,例如,今年CountAccts中“John”的两个结果在结果中也会重复,并且所有结果都会相乘……)

  • 尝试将每个查询作为子查询: 从中选择* (还选择了u.id为ufid的第一个查询)作为第一个, (还选择了u.id为usid的第二个查询)作为第二个查询 按ufid、usid分组
得到了这样的结果:

Some-query:
UserName | CountAccts | SumAccts | CountAcctsThisYear
-----------------------------------------------------
'John'   | 3          | 4000     | 2
'Peter'  | 1          | 1500     | 1
'Luke'   | 1          | 2500     | 0
UserName | CountAccts | SumAccts | CountAcctsThisYear
-----------------------------------------------------
'John'   | 6          | 6000     | 6
'Peter'  | 1          | 1500     | 1
'Luke'   | 0          | 0        | 0
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方面的专家,特别是在连接方面:-/

SELECT u.name as Username,
       COUNT(a.id) as CountAccts,
       SUM(a.amount) as SumAccts
FROM   User u
INNER JOIN Accounts a ON u.id = a.userid
GROUP BY u.id,YEAR(a.date)
试试这个

试试这个

试试这个:

SELECT u.`Name` as UserName,
       Count(*) as CountAccts,
       SUM(a.`amount`) as SumAccts,
       COALESCE(iTable.CountAcctsThisYear, 0) as CountAcctsThisYear
FROM    `User` u INNER JOIN `Accounts` a
                    ON u.`ID` = a`.`ID`
               LEFT JOIN
                   (SELECT `ID`, Count(*) as CountAcctsThisYear
                    FROM `Accounts`
                    WHERE DATE_FORMAT(`date`,'%Y') = DATE_FORMAT(CURDATE(),'%Y')
                    GROUP BY `ID`) as iTable
                ON `User`.`ID` = iTable.`ID`
GROUP BY `User`.`Name`
试试这个:

SELECT u.`Name` as UserName,
       Count(*) as CountAccts,
       SUM(a.`amount`) as SumAccts,
       COALESCE(iTable.CountAcctsThisYear, 0) as CountAcctsThisYear
FROM    `User` u INNER JOIN `Accounts` a
                    ON u.`ID` = a`.`ID`
               LEFT JOIN
                   (SELECT `ID`, Count(*) as CountAcctsThisYear
                    FROM `Accounts`
                    WHERE DATE_FORMAT(`date`,'%Y') = DATE_FORMAT(CURDATE(),'%Y')
                    GROUP BY `ID`) as iTable
                ON `User`.`ID` = iTable.`ID`
GROUP BY `User`.`Name`

@Benjam:我认为主表应该是Accounts,内部连接应该是Accounts。所以用户必须出现在用户表中。它将避免重复。并将得到适当的结果。对于没有帐户的用户失败。OP在3列解决方案中使用左连接是有原因的,这对他来说很好。我正在考虑用户在account表中至少有一个帐户(行)。所以将得到用户拥有帐户的结果。若这不是必需的,那个么应该采用左联接,表顺序将改变。@Benjam:我认为主表应该是Accounts,而内部联接应该采用。所以用户必须出现在用户表中。它将避免重复。并将得到适当的结果。对于没有帐户的用户失败。OP在3列解决方案中使用左连接是有原因的,这对他来说很好。我正在考虑用户在account表中至少有一个帐户(行)。所以将得到用户拥有帐户的结果。如果这不是必需的,那么应该采取左联接,并且表顺序将更改。谢谢!我还在测试,因为我的真实数据有更多的条件,但最重要的部分是我发布的东西。。。现在,这似乎是正确的答案,我一完成测试就告诉你!谢谢我还在测试,因为我的真实数据有更多的条件,但最重要的部分是我发布的东西。。。现在,这似乎是正确的答案,我一完成测试就告诉你!:Group By应该是a.USERID如何在表中按u.id分组,其中u.id不是倍数。它是独一无二的。我认为groupby应该是一个.userid。你测试过吗?a.userid和u.id相同,我们在这个条件下加入。:groupby应该是By a.userid你怎么能在表中按u.id分组,其中u.id不是倍数。它是独一无二的。我认为groupby应该是一个.userid。你测试过了吗?a.userid和u.id是一样的,我们在这个条件下加入。