将SELECT DISTINCT转换为Postgresql到MySQL的查询
我一直在使用PostgreSQL,现在正在迁移到
MySQL.
在我的查询中,我使用PostgreSQL的SELECT DISTINCT ON(col1,col2,col3),我想知道MySQL中是否有任何对应的这个语句.
没有完全相同的方式将使用SELECT DISTINCT ON的Postgresql查询转换为MySQL.
Postgresql SELECT DISTINCT ON 在Postgresql中,以下查询将消除表达式(col1,col3)匹配的所有行,并且它将只保留每组匹配行的“first col4,col5 row”: SELECT DISTINCT ON (col1,col3) col4,col5 FROM tablename 所以如果你的表是这样的: col1 | col2 | col3 | col4 | col5 -------------------------------- 1 | 2 | 3 | 777 | 888 1 | 2 | 3 | 888 | 999 3 | 3 | 3 | 555 | 555 我们的查询将只保留一行(1,2,3)和一行(3,3,3).结果行将是: col4 | col5 ----------- 777 | 888 555 | 555 请注意,每组的“第一行”是不可预测的,我们的第一行也可能是(888,999),除非我们指定了一个ORDER BY: SELECT DISTINCT ON (col1,col5 FROM tablename ORDER BY col1,col3,col4 (表达式上的DISTINCT必须与最左边的ORDER BY表达式匹配,但ORDER BY可以包含其他表达式). MySQL扩展到GROUP BY MySQL扩展了使用GROUP BY,以便我们可以选择GROUP BY子句中未命名的非集合列.每当我们选择非集合列时,服务器可以从该列中的每个组中选择任何值,因此结果值将被确定. 所以这个Postgresql查询: SELECT DISTINCT ON (col1,col5 FROM tablename 可以认为相当于这个MySQL查询: SELECT col4,col5 FROM tablename GROUP BY col1,col3 Postgresql和MySQL都将为每个(col1,col3)返回“第一行”,并且在这两种情况下,返回的行是不可预测的,因为我们没有指定和order by子句. 很多人会很乐意用ORDER BY转换这个Postgresql查询: SELECT DISTINCT ON (col1,col4 用这个: SELECT col4,col5 FROM ( SELECT col1,col4,col5 FROM tablename ORDER BY col1,col4 ) s GROUP BY col1,col3 这里的想法是将ORDER BY应用到子查询,以便当col1,col3的MySQL组将保留col4和col5的第一个遇到的值.这个想法很好,但是错了! MySQL可以自由选择col4和col5的任何值,我们不知道遇到的是第一个值,它取决于优化器.所以我会纠正这个: SELECT t1.col4,t1.col5 FROM tablename t1 INNER JOIN (SELECT col1,MIN(col4) as m_col4 FROM tablename GROUP BY col1,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 但是这开始变得越来越复杂了. 结论 作为一般规则,没有一种将Postgresql查询转换为MySQL查询的确切方法,但是有很多解决方法,生成的查询可能与原始查询一样简单,或者可能变得非常复杂,但这取决于查询本身. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |