我一直在使用 PostgreSQL ,现在迁移到 MySQL 。
在我的查询中,我使用的是 PostgreSQL 的SELECT DISTINCT ON (col1, col2, col3)
,我想知道在
MySQL中 是否有与此语句相对应的内容。
没有将使用SELECT DISTINCT ON的Postgresql查询转换为MySQL的完全等效的方法。
PostgreSQL的选择DISTINCT ON
在Postgresql中,以下查询将消除表达式(col1, col2, col3)
匹配的所有行,并且将仅为每组匹配的行保留“第一col4,col5行”:
SELECT DISTINCT ON (col1, col2, 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, col2, col3) col4, col5
FROM tablename
ORDER BY col1, col2, col3, col4
(表达式上的DISTINCT必须与最左边的ORDER BY表达式匹配,但是ORDER BY可以包含其他表达式)。
MySQL对GROUP BY的扩展
MySQL扩展了GROUP BY的使用,以便我们可以选择未在GROUP
BY子句中命名的非聚合列。每当我们选择非聚合列时,服务器都可以从该列的每个组中自由选择任何值,因此结果值将是不确定的。
所以这个Postgresql查询:
SELECT DISTINCT ON (col1, col2, col3) col4, col5
FROM tablename
可以认为等同于以下MySQL查询:
SELECT col4, col5
FROM tablename
GROUP BY col1, col2, col3
Postgresql和MySQL都将为每个(col1,col2,col3)返回“第一行”,在两种情况下,返回的行都是不可预测的,因为我们没有指定by
order子句并对其进行排序。
很多人会很想使用ORDER BY转换此Postgresql查询:
SELECT DISTINCT ON (col1, col2, col3) col4, col5
FROM tablename
ORDER BY col1, col2, col3, col4
与此:
SELECT col4, col5
FROM (
SELECT col1, col2, col3, col4, col5
FROM tablename
ORDER BY col1, col2, col3, col4
) s
GROUP BY col1, col2, col3
这里的想法是将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
但这开始变得越来越复杂。
结论
通常,没有将Postgresql查询转换为MySQL查询的确切方法,但是有很多解决方法,生成的查询可能与原始查询一样简单,或者可能变得非常复杂,但这取决于查询本身。
我试图将下面的PostgreSQL查询转换为本机查询,但遇到错误。 Postgres查询: 本机查询: 但我得到了以下错误: 无法提取结果集;SQL [n/a];嵌套异常是 org.hibernate.exception.SQLGrammarException: 无法提取 ResultSet
问题内容: 我需要将此查询从MySQL格式转换为SQLite。我正在尝试自己,但发现了一些困难。 在SQLite中,curdate()和interval函数不存在。 问题答案: 这是基本语法: 我忽略了该子句,因为这些日期是过去1000多个日期,因此他们无论如何都不会选择任何内容。
问题内容: 我想将以下SQL查询转换为Elasticsearch之一。谁能帮上忙 我尝试了以下方法: 但不确定我是否做对了,因为它无法验证结果。似乎要在聚合内添加查询。 问题答案: 假设您使用Elasticsearch 2.x,则有可能在Elasticsearch中 具有 -semantics。我不知道2.0之前的可能性。 您可以使用新的Pipeline Aggregation Bucket Se
我使用了cakephp Mysql到mongodb查询组件,即将Mysql查询转换到mongodb中,但是当查询有多个括号时代码停止工作,我还尝试将http://www.querymongo.com/site上的查询转换为相同的问题,
问题内容: 多亏了Erwin Brandstetter在我之前的问题“具有has_many关系的订单”中的帮助,我的SQL查询才能正常工作。 如何将该SQL转换为ActiveRecords或AREL查询以在范围中使用? 我最近来的是在朋友的帮助下… …这给了我一个错误: 更新: 我之前的问题对相关的架构和查询有完整的描述。但是基本上Articles have_many Metrics和一个Metr
问题内容: 实际上,我有1个查询,但无法将其转换为CakePHP查询格式。 当我将此查询转换为CakePHP时,会出现如下错误: 问题答案: 您可以轻松地在Cake上运行直接SQL查询,例如:$ this-> Picture-> query(“ SELECT * FROM pictures LIMIT 2;”); 或尝试与此类似的东西: ..确保您已正确链接Esl_Userresults和Esl_