假设我正在尝试对银行和分行进行编目,其中银行通过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特定的要求,请随意抛出它们。
答案 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中定义但不在聚合函数中的列值将是任意的 - 数据集越大,就越不可能始终保证相同的输出。
答案 2 :(得分:0)
可能?
select DISTINCT bank_id from branches
ORDER BY awesomeness desc;