POSTGRESQL 到 MYSQL:转换 SELECT DISTINCT ON 查询
导航数据库迁移可能具有挑战性,尤其是从 PostgreSQL 转换到 MySQL 时。一种常见的查询构造 SELECT DISTINCT ON 引发了对其 MySQL 对应项的疑问。
Postgresql SELECT DISTINCT ON
在 PostgreSQL 中,SELECT DISTINCT ON 允许消除重复项基于指定表达式(col1、col2、col3)的行,同时保留每个唯一集的“第一”行。例如,如果表包含重复行:
col1 | col2 | col3 | col4 | col5 -------------------------------- 1 | 2 | 3 | 777 | 888 1 | 2 | 3 | 888 | 999 3 | 3 | 3 | 555 | 555
查询 SELECT DISTINCT ON (col1, col2, col3) col4, col5 FROM tablename 将返回:
col4 | col5 ----------- 777 | 888 555 | 555
选择如果不指定 ORDER BY 子句,“第一”行的值是不可预测的。
MySQL 对 GROUP BY 的扩展
MySQL 扩展了 GROUP BY 的使用,允许选择未在 GROUP BY 子句中显式命名的非聚合列。然而,服务器从每个组中选择的值是任意的,导致查询输出中出现不可预测的值。
转换为 MySQL
MySQL 缺乏与PostgreSQL SELECT DISTINCT ON 构造。模拟其功能的一种方法是通过 GROUP BY 的 MySQL 扩展:
SELECT col4, col5 FROM tablename GROUP BY col1, col2, col3
此查询将为每个 (col1, col2, col3) 集返回“第一”行,类似于 PostgreSQL 查询。但是,由于缺少 order by 子句,返回的行仍然不确定。
可以通过修改查询来实现更精确地选择“第一”行:
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
这查询有效地检索每个唯一表达式集(col1、col2、col3)的 col4 最小值的行,从而提供更可预测的输出。
结论
将 PostgreSQL 查询转换为 MySQL 查询需要具体情况分析。虽然确切的等价物可能并不总是存在,但各种策略和解决方法提供了解决方案,从相对简单到中等复杂,具体取决于查询的性质。
以上是如何在 MySQL 中复制 PostgreSQL 的 SELECT DISTINCT ON 功能?的详细内容。更多信息请关注PHP中文网其他相关文章!