- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个关于 MySQL 的有点复杂的问题。这是我的表:
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/
我是一名优秀的程序员,十分优秀!