【问题标题】:Mysql Query select count(*) from multiple tablesMysql 查询从多个表中选择计数(*)
【发布时间】:2018-06-08 11:04:26
【问题描述】:

我有三个表 movie_request,movie_request_2movie_request_3 我想从每个表中获取 count() 并作为一行返回,每个表 count() 作为一列.

movie_request 是 free_cnt, movie_request_2 是 plus_cnt, movie_request_3是visitor_cnt

我希望得到类似的结果

movie_id | movie_title | free_cnt | plus_cnt | visitor_cnt
   10    |   Test      |    5     |    10    |    15
   11    |   Test2     |    6     |    11    |    25

这是我的查询

SELECT movie_title,movie_id,MAX(x.free_cnt) as free_cnt, MAX(x.plus_cnt) as plus_cnt, MAX(x.visitor_cnt) as visitor_cnt, (MAX(x.free_cnt) + MAX(x.plus_cnt) + MAX(x.visitor_cnt)) AS total
        FROM (
            SELECT a1.id as movie_id, a1.movie_title as movie_title, 0 as plus_cnt, 0 as visitor_cnt, COUNT(*) AS free_cnt
            FROM movie_request a1
            GROUP BY a1.movie_title
            UNION ALL

            SELECT a2.id as movie_id, a2.movie_title as movie_title,  0 as free_cnt, 0 as visitor_cnt, COUNT(*) AS plus_cnt
            FROM movie_request_2 a2
            GROUP BY a2.movie_title
            UNION ALL

            SELECT a3.id as movie_id, a3.movie_title as movie_title,  0 as plus_cnt, 0 as free_cnt,  COUNT(*) AS visitor_cnt
            FROM movie_request_3 a3
            GROUP BY a3.movie_title
        ) AS x
        GROUP BY movie_title

我不断得到这样的结果

 movie_id | movie_title | free_cnt | plus_cnt | visitor_cnt
       10    |   Test      |    5     |    0    |    0
       11    |   Test2     |    6     |    0    |    0

我已经单独测试了结果,它们都返回结果。

我该如何解决?

【问题讨论】:

  • 我认为内部查询中列的顺序可能会影响它。
  • movie 表吗?为什么每张表都重复电影名???

标签: mysql


【解决方案1】:

在各种选择中,保持相同的列顺序。
所以

SELECT   a1.id as movie_id,
         a1.movie_title as movie_title,
         COUNT(*) AS free_cnt
         0 as plus_cnt,
         0 as visitor_cnt
FROM     movie_request a1
GROUP BY a1.movie_title

UNION ALL

SELECT   a2.id as movie_id,
         a2.movie_title as movie_title,
         0 as free_cnt,
         COUNT(*) AS plus_cnt,
         0 as visitor_cnt
FROM     movie_request_2 a2
GROUP BY a2.movie_title

UNION ALL

SELECT   a3.id as movie_id,
         a3.movie_title as movie_title,
         0 as plus_cnt,
         0 as free_cnt,
         COUNT(*) AS visitor_cnt
FROM     movie_request_3 a3
GROUP BY a3.movie_title

【讨论】:

    【解决方案2】:

    我通过参考以下链接得到了解决方案

    https://stackoverflow.com/questions/3761240/count-from-multiple-tables-in-mysql
    

    【讨论】:

      【解决方案3】:

      一种选择是将三个表与一个计算列联合在一起。然后,使用条件聚合并转出所需的计数:

      SELECT
          t.movie_id,
          t.movie_title,
          COUNT(CASE WHEN t.label = 'free'    THEN 1 END) AS free_cnt,
          COUNT(CASE WHEN t.label = 'plus'.   THEN 1 END) AS plus_cnt,
          COUNT(CASE WHEN t.label = 'visitor' THEN 1 END) AS visitor_cnt
      FROM
      (
          SELECT movie_id, movie_title, 'free' AS label
          FROM movie_request
          UNION ALL
          SELECT movie_id, movie_title, 'plus'
          FROM movie_request_2
          UNION ALL
          SELECT movie_id, movie_title, 'visitor'
          FROM movie_request_3
      ) t
      GROUP BY
          t.movie_id, t.movie_title;
      

      顺便说一句,您的架构设计确实有一些不足之处。您通常不必为简单的报告问题编写如此丑陋的查询。最有可能的是,您应该只有一个电影请求表,可能带有我必须在上面生成的计算列。

      【讨论】:

        猜你喜欢
        • 2014-11-09
        • 1970-01-01
        • 2016-04-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多