MySQL:ORDER BY + GROUP BY 具有自定义顺序

标签 mysql group-by sql-order-by

我有一个与 MySQL 相关的有点复杂的问题。这是我的 table :

keyword   args     title    namespace_id      ratio
en        1        A        23                0.5
en        1        B        89                0.6
en        0        C        89                0.4
foo       1        Foo      23                0.7
bar       1        Bar      89                0.3

我想要一个不重复(关键字,参数)的所有行的列表。如果存在重复项,则应按我提供的 namespace_ids 的顺序选择所选行。剩下的行应按比例排序。

namespace_id 顺序为 23,89,x,y 的示例结果:

keyword   args     title    namespace_id      ratio
foo       1        Foo      23                0.7
en        1        A        23                0.5
en        0        C        89                0.4
bar       1        Bar      89                0.3

命名空间顺序为 89,23,x,y 的示例结果:

keyword   args     title    namespace_id      ratio
foo       1        Foo      23                0.7
en        1        B        89                0.6
en        0        C        89                0.4
bar       1        Bar      89                0.3

有什么办法可以直接在 MySQL 中实现这一点吗?我查看了 GROUP BY、ORDER BY,甚至注意到了 GROUP_CONCAT() 函数,但我没有设法将它们正确地组合在一起。以某种方式做我想要的声明是:

  SELECT keyword, args, title, namespace_id, ratio 
    FROM tbl 
GROUP BY keyword, args 
ORDER BY ratio DESC;

但是现在我不知道如何引入namespace_id顺序。

我发现了类似的问题: MySQL: "order by" inside of "group by" 那里的答案接近我想要的,但是,我的namespace_id顺序是变化的,无法通过MAX()函数计算。

编辑:这里的挑战是告诉GROUP BY要选择哪一行。普通的 ORDER BY 显然没有,它只使用 GROUP BY 的输出。

最佳答案

尝试使用 FIELD() 和子查询:

SELECT t1.keyword, t1.args, t1.title, t1.namespace_id, t1.ratio
FROM tbl t1, (SELECT keyword, args, MIN(FIELD(namespace_id, 23, 89))
minfield FROM tbl GROUP BY keyword, args) t2
WHERE t1.keyword = t2.keyword AND t1.args = t2.args AND
FIELD(t1.namespace_id, 23, 89) = t2.minfield
ORDER BY ratio DESC;

或自外连接:

SELECT t1.keyword, t1.args, t1.title, t1.namespace_id, t1.ratio
FROM tbl t1
LEFT OUTER JOIN tbl t2 ON
    t1.keyword = t2.keyword AND
    t1.args = t2.args AND
    FIELD(t1.namespace_id, 23, 89) < FIELD(t2.namespace_id, 23, 89)
WHERE t2.keyword IS NULL AND t2.args IS NULL
ORDER BY t1.ratio DESC;

编辑:也许值得一看一些支持 OLAP 操作的(商业)DBMS(如果您能够选择并且正在处理大量数据)。对于 Georg 的情况,我认为 OVER 和 PARTITION BY 关键字会有帮助:http://publib.boulder.ibm.com/infocenter/rbhelp/v6r3/topic/com.ibm.redbrick.doc6.3/sqlrg/sqlrg36.htm#sii06377181

关于MySQL:ORDER BY + GROUP BY 具有自定义顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9417785/

相关文章:

mysql - 让 Heroku 应用程序的 DATABASE_URL 指向 Media Temple GS 数据库

php - 将user_id添加到Session mysql中

python - 按ponyorm中的子字符串分组

apache-spark - GroupByKey并创建值列表pyspark sql dataframe

mysql - 使用 MySQL 选择查询以随机顺序对特定数据组的记录进行排序

mysql - GROUP_CONCAT 与 ORDER BY ,但结果未排序

php - 对 woocommerce 中的价格进行四舍五入

sql - Oracle 仅按一列分组

python - 通过另一列 pandas 找到列组的最大值

MySQL 按最高分排序