`
yueguangyuan
  • 浏览: 336817 次
  • 性别: 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方法,不过这个我没测试。

相关推荐

    分析MySQL中优化distinct的技巧

    MySQL的执行计划显示,原始SQL语句`SELECT COUNT(DISTINCT nick) FROM user_access`使用了`ind_user_access`索引进行全扫描,这意味着数据库需要遍历整个索引来获取不重复的`nick`值。这显然是低效的,因为即使使用...

    【DISTINCT】优化之MySQL官方文档翻译

    此外,如果查询中没有使用所有指定表的字段,MySQL可以在找到第一次匹配后停止扫描任何未使用的表。例如,在以下查询中,假设`t1`先于`t2`进行处理(可以通过`EXPLAIN`命令验证),对于`t1`中的任何特定记录,一旦从...

    mysql中distinct用法【SQL中distinct的用法】.docx

    MySQL 中 DISTINCT 用法详解 MySQL 中的 DISTINCT 关键字用于返回唯一不同的值,避免重复值的出现。当我们在查询表中数据时,可能会遇到重复值的情况,这时使用 DISTINCT 关键字可以帮助我们返回唯一的值。 ...

    MySQL中索引优化distinct语句及distinct的多字段操作

    MySQL通常使用GROUPBY(本质上是排序动作)完成DISTINCT操作,如果DISTINCT操作和ORDERBY操作组合使用,通常会用到临时表.这样会影响性能. 在一些情况下,MySQL可以使用索引优化DISTINCT操作,但需要活学活用.本文涉及一个...

    用Distinct在MySQL中查询多条不重复记录值,绝对的物有所值

    今天,我们将深入探讨如何使用`DISTINCT`关键字在MySQL中查询多条不重复记录值,这不仅是一种实用技能,也是提升数据处理效率的关键所在。 ### `DISTINCT`关键字详解 `DISTINCT`关键字在SQL查询中扮演着一个至关...

    MySQL DISTINCT 的基本实现原理详解

    在某些情况下,MySQL可以使用松散索引扫描来执行DISTINCT操作。例如,当查询只包含DISTINCT关键字和一个被索引的列时,MySQL会遍历索引,对每个不同值形成一个组,然后返回每个组的第一个记录。在EXPLAIN计划中,`...

    小度写范文【SQL中distinct的用法】mysql中distinct用法模板.pdf

    在MySQL中,`DISTINCT`的使用方式非常灵活,可以从单个列到多个列进行操作,也可以与聚合函数如`COUNT()`结合使用。以下是关于`DISTINCT`在SQL中的具体用法和一些注意事项。 1. **单列去重** 当我们只对单一列应用...

    小度写范文【SQL中distinct的用法】mysql中distinct用法模板.docx

    在MySQL中,`DISTINCT`的使用方式和功能与其他SQL数据库系统(如SQL Server、Access等)大体相同,但有一些细微的差别。以下是对`DISTINCT`用法的详细解释: 1. **单列去重**: 当我们需要从一个表中获取唯一的某...

    vc 小技巧 mysql distinct 语句

    在数据库管理领域,MySQL是一种广泛使用的开源关系型数据库管理系统,其功能强大且高效。当我们处理数据时,有时需要从查询结果中去除重复的记录,这时`DISTINCT`关键字就派上了用场。本文将深入探讨MySQL中的`...

    Mysql中distinct与group by的去重方面的区别

    在MySQL数据库中,`DISTINCT` 和 `GROUP BY` 是两个非常重要的SQL关键字,它们都可以用来处理数据的去重问题,但在实际应用中,两者的使用场景和效果有所差异。 首先,`DISTINCT` 关键字的主要作用是去除查询结果中...

    MySQL关键字Distinct的详细介绍

    MySQL中的`DISTINCT`关键字是用于消除查询结果中的重复行,从而返回唯一不同的值。它在数据查询中扮演着至关重要的角色,特别是在处理可能存在重复记录的数据表时。下面将详细介绍`DISTINCT`关键字的用法及其注意...

    MySQL中distinct与group by语句的一些比较及用法讲解

    在MySQL数据库中,`DISTINCT` 和 `GROUP BY` 是两种用于数据去重和分组统计的SQL语句,它们虽然都可以帮助我们处理重复数据,但有着不同的应用场景和执行机制。 1. `DISTINCT` 关键字: - `DISTINCT` 主要用于去除...

    使用Distinct查询.rar

    本教程将深入探讨如何使用`DISTINCT`查询,以及在不同场景下它的应用。 一、DISTINCT基本用法 1.1 基础查询 当你想要从数据库中获取不重复的记录时,可以在`SELECT`语句中使用`DISTINCT`关键字。例如,假设有一个...

    MySQL中Distinct和Group By语句的基本使用教程

    在MySQL数据库中,`DISTINCT`和`GROUP BY`是两个非常重要的查询语句,它们在处理数据去重和分组方面发挥着关键作用。本文将详细介绍这两个语句的使用方法。 首先,`DISTINCT`关键字是用来去除查询结果中重复记录的...

    MySQL中distinct和count(*)的使用方法比较

    `COUNT(*)` 的使用需要注意,如果没有 `WHERE` 条件,使用 `COUNT(*)` 通常比 `COUNT(DISTINCT column)` 快,因为后者需要处理重复值。然而,如果仅关心特定列的不重复值数量,那么 `COUNT(DISTINCT column)` 是必要...

    MySQL中distinct语句去查询重复记录及相关的性能讨论

    总之,`DISTINCT`是MySQL中处理重复数据的关键工具,但在使用时要注意其性能影响和正确性。优化查询、合理利用索引以及谨慎选择`DISTINCT`的应用位置,是提高查询效率和确保数据准确性的重要策略。在实际工作中,应...

    解析mysql不重复字段值求和

    在使用mysql时,有时需要查询出某个字段不重复的记录,虽然mysql提供有distinct这个关键字来过滤掉多余的重复记录只保留一条,但往往只用它来返回不重复记录的条数,而不是用它来返回不重记录的所有值。其原因是...

Global site tag (gtag.js) - Google Analytics