多表联合查询导致的数据重复问题

运营让我查询一个活动中参与的物品数,然后需要前60个评论+赞的人。

最开始我用子查询实现,巨慢无比:

select id,like_count,favorite_count from message_message where id in(select message_id from message_message_tags where messagetag_id=62101) and (category=9 or category=1) order by (like_count+favorite_count) desc


原因是in子句的数据量大的话,性能就会非常低下。详见:

修改成多表查询:

select t1.sender_id,t1.id,t1.like_count,t1.favorite_count,t1.add_datetime from message_message t1, message_message2tag t2 where t1.id = t2.message_id and t2.tag_id=120560 and t1.category in (9,1) and t1.add_datetime>'2012-06-29' and t1.add_datetime < '2012-07-03' order by (like_count+favorite_count) desc limit 60


性能解决了,但发现有重复记录:
+----------+------------+----------------+-----------+---------------------+
| id | like_count | favorite_count | sender_id | add_datetime |
+----------+------------+----------------+-----------+---------------------+
| 33850491 | 2 | 220 | 471956 | 2012-06-29 20:42:47 |
| 33778187 | 14 | 167 | 122216 | 2012-06-29 12:24:15 |
| 33779339 | 8 | 165 | 122216 | 2012-06-29 12:33:57 |
| 34068745 | 0 | 112 | 3054 | 2012-07-01 15:00:26 |
| 33782239 | 4 | 94 | 116633 | 2012-06-29 12:58:23 |
| 33815718 | 2 | 92 | 4287 | 2012-06-29 17:10:13 |
| 33905850 | 3 | 87 | 85131 | 2012-06-30 10:36:39 |
| 33827272 | 1 | 75 | 171462 | 2012-06-29 18:21:31 |
| 33778798 | 7 | 69 | 122216 | 2012-06-29 12:29:38 |
| 33780283 | 8 | 64 | 122216 | 2012-06-29 12:42:15 |
| 33816638 | 0 | 59 | 4287 | 2012-06-29 17:16:16 |

122216一个会员发了多条记录,看来需要做distinct,直接把distinct加在字段前面是没有效果,可以通过结合子查询来和group来做,最终版:


select * from (select t1.sender_id,t1.id,t1.like_count,t1.favorite_count,t1.add_datetime from message_message t1, message_message2tag t2 where t1.id = t2.message_id and t2.tag_id=120560 and t1.category in (9,1) and t1.add_datetime>'2012-06-29' and t1.add_datetime < '2012-07-03' order by (like_count+favorite_count) desc limit 60) as t group by t.sender_id order by (like_count+favorite_count) desc;



这个人提到说通过
 select *, count(distinct name) from table group by name 
来实现
http://hi.baidu.com/liveinyc/blog/item/facac543a2dc260b9213c658.html
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值