【问题标题】:Yii ActiveRecord: select only first row with the same valueYii ActiveRecord:仅选择具有相同值的第一行
【发布时间】:2014-04-18 04:49:47
【问题描述】:

假设我有下表:(id, subject_id) 并且在此表中我有以下记录:

id:1,subject_id:1 id:2,subject_id:1 id:3,subject_id:2 id:4,subject_id:1 id:5,subject_id:2

我怎样才能只获得 subject_id = 1 的第一行和 subject_id = 2 的第一行:

id:1,subject_id:1 id:3,subject_id:2

【问题讨论】:

    标签: php mysql sql activerecord yii


    【解决方案1】:

    当您使用 group by 时,只会获取第一条记录。

    $criteria = new CDbCriteria;
    $criteria->group = 'subject_id';
    $models = YouModelName::model()->findAll($criteria);
    

    【讨论】:

    • 这是不正确的。生成的 SQL 将没有聚合函数,因此结果将是不确定的。这个答案的结果完全是巧合,不可靠。请阅读我的解释。
    【解决方案2】:
    select * from (select id,subject_id FROM table group by subject_id)tempalias where subject_id=1
    
    select * from (select id,subject_id FROM table group by subject_id)tempalias where subject_id=2
    

    【讨论】:

    • 这并没有提供问题的答案。要批评或要求作者澄清,请在其帖子下方发表评论。
    • 我认为这就是他要找的东西。他正在寻找查询以达到给定的结果,我发布了查询。还有什么?你的意思是我需要给他学习子查询的链接吗? @迈克尔·罗兰
    • 我标记了这个有两个原因:(1)答案质量很差,没有任何解释; (2) OP 专门要求 Yii ActiveRecord,所以我希望得到一个答案来解释 OP 如何使用该抽象来做到这一点,而不仅仅是两个普通的 SQL 查询。
    【解决方案3】:

    我建议的解决方案是使用 min(id) 作为 Criteria 中的聚合函数 [假设 id 是自动递增或手动递增的]。

    $criteria = new CDbCriteria();
    $criteria->select = "min(id), subject_id";
    $criteria->group = "subject_id";
    $models = ModelName::model()->findAll($criteria);
    

    没有 sql 函数(假设 MySQL db)来获取第一行。从最新的 MySQL 文档中查看Group by functions

    CDbCriteria's group property 与底层 SQL 引擎 group by 函数完全相关。当没有提供显式聚合函数时,还有no default aggregate function。 MySQL 说它是illegal 来选择你不包括在group by 子句中的列[也就是说你没有在那个列上放置一个聚合函数]。

    MySQL 文档指出,如果您选择未包含在 group by 子句中的列 [没有聚合函数],则结果将为 indeterminate

    也检查这个 SO 问题:GROUP BY behavior when no aggregate functions are present in the SELECT clause

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-22
      • 1970-01-01
      • 2015-07-17
      • 2012-03-03
      • 2016-11-11
      • 1970-01-01
      • 2021-02-06
      • 2022-08-17
      相关资源
      最近更新 更多