【问题标题】:Counting the number of overall entries from 2 different tables计算来自 2 个不同表的总条目数
【发布时间】:2013-03-02 21:32:51
【问题描述】:

我正在尝试按我的用户提交到 2 个不同表格的条目数对他们进行排名。

表 gvr:

rid | jid 
---------------
1     54
2     54
3     54
4     75
5     75

表去:

sid | jid
---------------
1     54
2     54
3     75
4     75
5     23
6     23

期望的结果:

jid | overall_cnt | gvr_cnt | gos_cnt
----------------------------------
54    5            3          2
75    4            2          2
23    2            0          2

我有:

(SELECT jid, count(*) gvr_count
FROM gvr 
WHERE jid IS NOT NULL
GROUP BY jid)
UNION ALL 
(SELECT jid, count(*) gos_count
FROM gos
WHERE jid IS NOT NULL
GROUP BY jid)

但这是非常不正确的。我一直在寻找与我的情况类似的其他帖子,但还没有找到任何有价值的东西。我正在考虑将数据操作加载到 PHP 上,但在一个查询中完成它会很方便。

【问题讨论】:

    标签: php mysql sql ranking


    【解决方案1】:

    我更新了 Gordon 的答案,这是最好的方法。

     select jid ,sum(gvr_count)+ sum(gos_count) as OverallCount ,
      sum(gvr_count) as gvr_count, sum(gos_count) as gos_count
       from ((SELECT jid, count(*) gvr_count, 0 as gos_count
       FROM gvr 
       WHERE jid IS NOT NULL
       GROUP BY jid
      )
      UNION ALL 
      (SELECT jid, 0 as gvr_count, count(*) gos_count
       FROM gos
       WHERE jid IS NOT NULL
       GROUP BY jid
      )
     ) t
    group by jid
    

    【讨论】:

      【解决方案2】:

      您的查询非常接近。你想要union all,然后做一个group by

      select jid, sum(gvr_count) + sum(gos_count) as Overall_Count,
              sum(gvr_count) as gvr_count, sum(gos_count) as gos_count
      from ((SELECT jid, count(*) gvr_count, 0 as gos_count
             FROM gvr 
             WHERE jid IS NOT NULL
             GROUP BY jid
            )
            UNION ALL 
            (SELECT jid, 0 as gvr_count, count(*) gos_count
             FROM gos
             WHERE jid IS NOT NULL
             GROUP BY jid
            )
           ) t
      group by jid
      

      我认为这是 MySQL 中确保获得所有“jid”的最佳方法,即使是那些仅在一个表中的。

      【讨论】:

      • 我错过了你在查询后的笔记中提到的条件:)
      【解决方案3】:
      SELECT temp.jid,gvr_cnt + gos_cnt as totals,temp.*
      FROM
      (
      SELECT gos1.jid
      ,(SELECT COUNT(*) from gvr where gvr.jid = gvr1.jid) AS gvr_cnt
      ,(SELECT COUNT(*) from gos where gos.jid = gos1.jid) AS gos_cnt
      FROM gos gos1 left join gvr gvr1 on gos1.jid = gvr1.jid
      group by gos1.jid
        ) as temp
      group by temp.jid
      

      SQL Fiddle Demo

      【讨论】:

      • 有什么东西会破坏mysql上的这个查询吗?因为它在 sqlfiddle 中工作。但我无法让它在我的系统上运行。
      【解决方案4】:

      这可能不完全正确,但我希望你能从这里开始:

      SELECT innerQuery_1.jid AS jid, 
             (innerQuery_1.gvr_count + innerQuery_2.gos_count) AS overall_cnt, 
             innerQuery_1.gvr_count AS gvr_count,
             innerQuery_2.gos_count AS gos_count
      FROM   (SELECT jid, count(*) gvr_count
              FROM   gvr 
              WHERE  jid IS NOT NULL
              GROUP BY jid) AS innerQuery_1,
             (SELECT jid, count(*) gos_count
              FROM   gos
              WHERE jid IS NOT NULL
              GROUP BY jid) AS innerQuery_2
      GROUP BY innerQuery_1.jid
      

      【讨论】:

      • 它没有返回 jid 23
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-27
      相关资源
      最近更新 更多