MYSQL GROUP BY和连表

有两个表,一个是test_actor,一个是test_fans。
其中,DESC test_actor,有
图片描述

DESC test_fans,有
图片描述

其中1,2,3,....一直到31为每个月的每一天,边幅过长,我就不全部字段截图上来了。
这个表是用来记录这个演员的粉丝增长的。

现在,我要展示每个演员的名字和TA对应的粉丝总数,写了一条SQL语句:
SELECT name, SUM(1+2+3+4+5+6+7+8+9+10+11+12+13+14+15+16+17+18+19+20+21+22+23+24+25+26+27+28+29+30+31) AS fans FROM test_fans AS f RIGHT JOIN test_actor AS a ON actorid=a.id GROUP BY actorid ORDER BY fans DESC;
得到如下结果:
图片描述

其实这样的结果就是我想要的,但我想起来,用了GROUP BY, 那么SELECT后面出现的字段是必须出现在GROUP BY后面(复合函数除外)。于是我又想了另一条语句:
SELECT name,fans FROM test_actor AS a RIGHT JOIN (SELECT actorid,SUM(1+2+3+4+5+6+7+8+9+10+11+12+13+14+15+16+17+18+19+20+21+22+23+24+25+26+27+28+29+30+31) as fans FROM test_fans GROUP BY actorid) AS f ON a.id=f.actorid ORDER BY fans DESC;
也得到了相同的结果。
我知道第二条语句肯定是没错的,但想知道第一条语句有没有问题(显然从结果来看是没有问题);若果第一条语句没有问题,那么第二条稍微有点累赘的语句就没必要使用了。

阅读 4.1k
2 个回答

其实结果主要是围绕test_fans来进行,而test_actor的用处只是对test_fans表查询的结果引入name字段
第一条SQL我们可以理解为针对test_actor和test_fans先连表查询,让这个临时表拥有test_fans的数据的同时拥有test_actor的name字段的值,然后对查询出来的结果group by actorid
第二条SQL我们可以拆开来看,括号内嵌套的SQL的执行结果是对test_fans进行查询并且对actorid完成了group by,此时缺失的仅仅为test_actor表的name字段的值,然后我们再看外层SQL,通过与test_actor连表查询获得name字段的值最后展示。
两种查询方式的效率则要根据具体两张表的数据数量以及查询过程中产生临时表的大小来决定
不知道这样解释,你能否理解

新手上路,请多包涵

你们这个表也设计的牛皮,,为啥不纵向扩展。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题