求正确SQL的写法。

1.问题:我一直不清楚一个SQL算出一个特定结果的写法,想向大神请教

2.代码:

SELECT tb.*,tbc.`comment` 
from blog_tinyblog AS tb,blog_tbcomment AS tbc 
where tb.user_id=tbc.user_id AND                    
tb.num=tbc.now_num
group by tbc.num_tiny_blog

我写的SQL是这样的,结果如图:图片描述

可这并不是我想要的结果,我希望去除重复,将comment存储为一个数组,成为只有一条结果的形式,请大神赤脚。也许可能会说用 distinct,但是不行
目的:我想写个微博评论系统 【现在是想显示出每条微博对应的评论】
图片描述

图片描述

图片描述

阅读 3.8k
3 个回答

大部分ORM一般有两种方式解决此类问题:

  1. 采用的 Lazy Load 方式,其实原理很简单:就是取两次,第一次取blog,第二次取blog对应的comment,只不过第二次取的操作延迟执行。

  2. 第二种就是题主这种一次查询的方式,只是ORM会根据查询的结果映射成你想要的那种形式(单个Blog对象中包含对应的Comment列表)。

所以综上,如果题主正在使用一种ORM工具,一般都包含这两种方式的处理;如果没有使用任何ORM,那题主需要自己实现一个对应的算法(其实就是一个类似reduce的算法)。

  1. 我没看懂你的意思。

  2. 你想要做什么。

  3. 首先你这全链接查询一般是没必要的。

  4. 再者没有聚集函数你用分组没有什么意义。

最佳方案是只获取微博和评论数就行了,具体的评论可以用ajax去取,没必要一次取出来,这样压力比较大。
如果你一定要一次取出来可以考虑group_concat这个函数,具体去查mysql手册,但是不推荐,如果评论很多的话这个效率会非常低甚至产生错误。

此外你的表设计也不合理。比如第几条微博,第几条评论,无评论 这三种注释代表的字段根本没用,用户删微博或者删评论的时候你也要在多条记录上维护相应的数据,麻烦死了。微博表有一个total_comments字段就足够了。至于到底是第几条,显示的时候自然就知道了,序号肯定是 (页码-1)*每页显示的记录数 + 当前页的第几行,所以没必要放在数据库里面。

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