如何让GROUP BY选择“最早”的结果?

时间:2011-02-06 04:35:52

标签: sql mysql ruby-on-rails

假设我正在尝试对银行和分行进行编目,其中银行通过branches.bank_id拥有多个分支机构。每个分支都有一个很棒的因素branches.awesomeness

如何构建一个返回按其最不可靠的分支排序的Banks列表的查询?

我有以下内容:

SELECT * FROM `banks`
  INNER JOIN `branches` ON `branches`.`bank_id` = `banks`.`id`
  GROUP BY `banks`.`id`
  ORDER BY `branches`.`awesomeness` ASC;

当我尝试这个时,其信息与任何给定银行分组的分支并不是最不可思议的分支(最早出现在删除GROUP BY语句的结果上的分支)。

我该如何做到这一点?

这意味着要使用Rails,因此如果使用arel样式语法更方便或考虑Rails特定的要求,请随意抛出它们。

3 个答案:

答案 0 :(得分:3)

如果您还想获取分支数据,我不明白为什么要使用GROUP BY。 从查询中删除GROUP BY,并将排序更新为: ORDER BY branches.bank_id, branches.awesomeness

如果你坚持灌浆,使用MIN()聚合函数来获得每个组的最低级别。

ORDER BY MIN(branches.awesomeness) ASC;


更新:如果你想要两者的混合,并希望通过“最不可思议”对银行进行排序,并且想要通过它们自己对银行中的分支进行排序,请使用此查询:

SELECT b.*, r.*, brs.MinAw
FROM banks b
    INNER JOIN branches r ON r.bank_id = b.id
    INNER JOIN (
        SELECT bank_id, MIN(awesomeness) MinAw
        FROM branches
        GROUP BY bank_id
    ) brs ON b.id = brs.bank_id
ORDER BY brs.MinAw, r.awesomeness;

答案 1 :(得分:1)

补充Scrum Meisters回答:

  • JOIN语法将记录从父级连接到子级,当子级可以有多条记录关联到父级记录时 - 您将获得重复项。

  • 从所有相关表中选择所有列时,
  • DISTINCT无效,因为需要为DISTINT复制整行以将其删除。在此示例中,每行将有不同的分支信息。

  • MySQL的GROUP BY支持忽略列被大多数人用作拐杖 - 很少有其他数据库支持这一点,所以如果你转移到SQL Server,Oracle,PostgreSQL ......它将无法工作MySQL的GROUP BY支持的问题是那些未在GROUP BY中定义但不在聚合函数中的列值将是任意的 - 数据集越大,就越不可能始终保证相同的输出。

    < / LI>

答案 2 :(得分:0)

可能?

select DISTINCT bank_id from branches
ORDER BY awesomeness desc;