Mic*_*dan 26 mysql postgresql select group-by distinct
我一直在使用PostgreSQL,现在正在迁移到MySQL.
在我的疑问,我使用的PostgreSQL的SELECT DISTINCT ON (col1, col2, col3),我想知道是否有这说法的任何对应的MySQL.
fth*_*lla 39
将使用SELECT DISTINCT ON的Postgresql查询转换为MySQL并不完全等效.
Postgresql SELECT DISTINCT ON
在Postgresql中,以下查询将消除表达式(col1, col2, col3)匹配的所有行,并且它将仅保留每组匹配行的"first col4,col5 row":
SELECT DISTINCT ON (col1, col2, col3) col4, col5
FROM tablename
Run Code Online (Sandbox Code Playgroud)
所以如果你的表是这样的:
col1 | col2 | col3 | col4 | col5
--------------------------------
1 | 2 | 3 | 777 | 888
1 | 2 | 3 | 888 | 999
3 | 3 | 3 | 555 | 555
Run Code Online (Sandbox Code Playgroud)
我们的查询只为(1,2,3)保留一行,为(3,3,3)保留一行.结果行将是:
col4 | col5
-----------
777 | 888
555 | 555
Run Code Online (Sandbox Code Playgroud)
请注意每组的"第一行"是不可预测的,除非我们指定ORDER BY,否则我们的第一行也可能是(888,999):
SELECT DISTINCT ON (col1, col2, col3) col4, col5
FROM tablename
ORDER BY col1, col2, col3, col4
Run Code Online (Sandbox Code Playgroud)
(表达式上的DISTINCT必须与最左边的ORDER BY表达式匹配,但ORDER BY可以包含其他表达式).
对GROUP BY的MySQL扩展
MySQL扩展了GROUP BY的使用范围,以便我们可以选择GROUP BY子句中未命名的非聚合列.每当我们选择非聚合列时,服务器可以自由地从该列中的每个组中选择任何值,因此结果值将是不确定的.
所以这个Postgresql查询:
SELECT DISTINCT ON (col1, col2, col3) col4, col5
FROM tablename
Run Code Online (Sandbox Code Playgroud)
可以认为等效于此MySQL查询:
SELECT col4, col5
FROM tablename
GROUP BY col1, col2, col3
Run Code Online (Sandbox Code Playgroud)
Postgresql和MySQL都将为每个返回"第一行"(col1,col2,col3),并且在这两种情况下返回的行都是不可预测的,因为我们没有指定和order by子句.
很多人都很想用ORDER BY转换这个Postgresql查询:
SELECT DISTINCT ON (col1, col2, col3) col4, col5
FROM tablename
ORDER BY col1, col2, col3, col4
Run Code Online (Sandbox Code Playgroud)
这一个:
SELECT col4, col5
FROM (
SELECT col1, col2, col3, col4, col5
FROM tablename
ORDER BY col1, col2, col3, col4
) s
GROUP BY col1, col2, col3
Run Code Online (Sandbox Code Playgroud)
这里的想法是将ORDER BY应用于子查询,以便当MySQL按col1,col2,col3分组时,它将保留col4和col5的第一个遇到的值.这个想法很好,但这是错的!MySQL可以自由选择col4和col5的任何值,我们不知道遇到的第一个值是哪个,它取决于优化器.所以我会纠正它:
SELECT t1.col4, t1.col5
FROM tablename t1 INNER JOIN (SELECT col1, col2, col3, MIN(col4) as m_col4
FROM tablename
GROUP BY col1, col2, col3) s
ON t1.col1=s.col1
AND t1.col2=s.col2
AND t1.col3=s.col3
AND t1.col4=s.m_col4
GROUP BY
t1.col1, t1.col2, t1.col3, t1.col4
Run Code Online (Sandbox Code Playgroud)
但这开始变得更加复杂.
结论
作为一般规则,没有一种将Postgresql查询转换为MySQL查询的确切方法,但是有很多变通方法,结果查询可能与原始查询一样简单,也可能变得非常复杂,但它依赖于查询本身.
| 归档时间: |
|
| 查看次数: |
18201 次 |
| 最近记录: |