Mysql 使用带计数(*)的右外部联接

Mysql 使用带计数(*)的右外部联接,mysql,Mysql,我对连接查询有问题。 我有三张桌子: 机器 +-----+--------+ | mid | points | +-----+--------+ | 12 | 25 | | 22 | 50 | | 23 | 75 | | 30 | 90 | +-----+--------+ 挑战 +----+-----+-----+ | id | mid | uid | +----+-----+-----+ | 1 | 22 | 9 | | 2 | 23 |

我对连接查询有问题。 我有三张桌子:

机器

+-----+--------+
| mid | points |
+-----+--------+
|  12 |     25 |
|  22 |     50 |
|  23 |     75 |
|  30 |     90 |
+-----+--------+
挑战

+----+-----+-----+
| id | mid | uid |
+----+-----+-----+
|  1 |  22 |   9 |
|  2 |  23 |  10 |
|  3 |  29 |  13 |
|  4 |  12 |  10 |
+----+-----+-----+
用户提示

+----+-----+-----+
| id | mid | uid |
+----+-----+-----+
|  1 |  22 |  10 |
|  2 |  23 |  10 |
|  3 |  30 |  10 |
|  4 |  22 |  11 |
+----+-----+-----+
我正在尝试创建一个查询,它将收集特定用户的一些统计信息到一行中

  • 对于挑战表中具有相应用户id(“uid”列)的所有记录,计算机器表“点数”列中的点数总和。它们由“mid”列关联。如果没有记录/点数,则返回0
  • 对于相同的用户id(uid列)-计算user\U HINTS表中的记录数,并将其与第一次查询的结果相关联
  • 这方面的预期结果是:

    +--------+------------+
    | points | totalhints |
    +--------+------------+
    |    100 |          3 |
    +--------+------------+
    
    这是我的疑问:

    SELECT challenges.id, 
            IFNULL(
            ( SELECT SUM(m.points) as points
            FROM challenges c
            INNER JOIN machines m ON (c.mid = m.mid AND c.uid = 10)
                    GROUP BY c.uid),'0') AS points,
            COUNT(*) as totalhints
            FROM challenges 
            RIGHT OUTER JOIN user_hints uh ON user_hints.uid = 10
            GROUP BY points
    
    但TotalHits已关闭,正在计算所有行。 我能得到一些关于最后一个内部连接部分的帮助吗?
    谢谢

    您可以执行以下操作,但实际上,当您将不同类型的内容混合在一起时,我认为最好在单独的查询中执行此操作

    SELECT DISTINCT j.uid
         , COALESCE(k.points,0) points
         , COALESCE(l.hints,0) hints
      FROM challenges j
      LEFT
      JOIN (SELECT c.uid, SUM(points) points FROM challenges c JOIN machines m ON m.mid = c.mid GROUP BY c.uid) k
        ON k.uid = j.uid
      LEFT
      JOIN (SELECT uid, COUNT(h.id) hints FROM user_hints h GROUP BY uid) l
        ON l.uid = j.uid;
    

    谢谢你,所以它并不总是最好的选择,以清除它与一个单一的查询毕竟。。。