`
yueguangyuan
  • 浏览: 333186 次
  • 性别: Icon_minigender_1
  • 来自: 新加坡
社区版块
存档分类
最新评论

MySQL 使用distinct后映射给ActiveRecord的疑惑

阅读更多
现在有这样一个需求,表1 topics 与 表2 comments 一对多关联,比如一个帖子包含用户的多个评论
表结构如下:
Table topics:
+----+----------+------------------------------------+
 | id  | name  | content                         
+----+----------+------------------------------------+

Table comments
+----+----------+---------------+-------------------+
 | id  | name  | topic_id   | user_id
+----+----------+---------------+--------------------+
我现在想查出一个用户参与评论的topics,首先想到用distinct,而MySQL对distinct的支持不好,必须只有这样使用:
mysql> select * , count(distinct user_id) from comments where user_id= 1 group by user_id;
+----+----------+------------------------------------------------------------------------------+
| id  | name  | topic_id   | user_id |  count(distinct user_register_id)
+----+----------+------------------------------------------------------------------------------+
| 1   |  aa      | 1            | 1          |    1
+----+----------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)

这样在MySQL中是将结果正确得出,但是还没结束,我需要将这个结果映射给Rails的ActiveRecord,因为查出的结果多了一个字段 count(distinct user_register_id),结果AR不认识了,查出来的结果为空,我晕!修改一下
mysql> select * , count(distinct user_id) as name from comments where user_id= 1 group by user_id;
+----+----------+------------------------------------------------------------------------------+
| id  | name  | topic_id   | user_id |  name
+----+----------+------------------------------------------------------------------------------+
| 1   |  aa      | 1            | 1          |    1
+----+----------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)


问题就是这样了,就是采用MySQL的distinct以后怎么去做ORMapping?难道我要添加一个字段?或者我这个需求有没有其他的解法?比如用left join,但是我不知道怎么在left join的时候去掉相同的字段。或者得到用户评论的topics可以使用其他方法后可以得到不重复的记录? 请指教
分享到:
评论
1 楼 yueguangyuan 2007-03-19  
可能是问的不够清楚,自问自答了,其实方法也是一位朋友提供的<br/>
<br/>
解决办法还是避开使用MySQL,有两种办法:<br/>
<br/>
1.使用left join(我现在就用这个)<br/>
<br/>
 MySql&gt;  select t.* from topics as t left join comments as c on t.id = c.topic_id where c.user_id = 1;<br/>
<br/>
 然后查出来的结果使用 topic.uniq,<br/>
<br/>
2.覆盖Comment的Uniq方法<br/>
<br/>
   重新定义Model  Comment的hash 和eql?方法<br/>
  
<div class='code_title'>ruby 代码</div>
<div class='dp-highlighter'>
<div class='bar'> </div>
<ol class='dp-rb' start='1'>
    <li class='alt'><span><span class='keyword'>  def</span><span> hash  </span></span></li>
    <li class=''><span>      user_id  </span></li>
    <li class='alt'><span>  <span class='keyword'>end</span><span>  </span></span></li>
    <li class=''><span>  <span class='keyword'>def</span><span> eql?(other)  </span></span></li>
    <li class='alt'><span>      <span class='keyword'>self</span><span>.user_id == other.user_id<br/>
    </span></span></li>
    <li class=''><span>  <span class='keyword'>end</span><span>  </span></span></li>
</ol>
</div>
然后在查出的结果用使用comments.uniq,虽然两个方法都达到了效果,但是第二种可能会出现问题,因为它覆盖了默认的方法,会造成其他问题。<br/>
<br/>
我朋友还说还可以在查询的时候使用:first参数查询,可以等同uniq方法,不过这个我没测试。

相关推荐

Global site tag (gtag.js) - Google Analytics