首页 > 数据库 > mysql教程 > 如何在 MySQL 中复制 PostgreSQL 的 SELECT DISTINCT ON 功能?

如何在 MySQL 中复制 PostgreSQL 的 SELECT DISTINCT ON 功能?

Mary-Kate Olsen
发布: 2024-11-10 15:49:02
原创
788 人浏览过

How to Replicate PostgreSQL's SELECT DISTINCT ON Functionality in MySQL?

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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板