首页  >  文章  >  数据库  >  如何在MySQL中实现Postgresql的DISTINCT ON功能?

如何在MySQL中实现Postgresql的DISTINCT ON功能?

Patricia Arquette
Patricia Arquette原创
2024-11-10 22:56:03173浏览

How to Achieve the Functionality of Postgresql's DISTINCT ON in MySQL?

将 Postgresql 的 DISTINCT ON 查询转换为 MySQL

从 Postgresql 迁移到 MySQL 通常需要调整现有查询。其中一种查询类型是 DISTINCT ON 查询,它在考虑多个列的同时检索唯一行。虽然 MySQL 缺乏完全相同的功能,但有一些方法可以实现类似的功能。

Postgresql 的 SELECT DISTINCT ON

Postgresql 的 SELECT DISTINCT ON 查询根据指定的列检索不同的行。例如:

SELECT DISTINCT ON (col1, col2, col3) col4, col5
FROM tablename

此查询对于 (col1, col2, col3) 的每个唯一组合仅返回一行,保留第一个遇到的 col4 和 col5 值。

MySQL 的Group By 扩展

MySQL 扩展了 GROUP BY 子句以允许选择非聚合列。但是,为每个组返回的特定行是不确定的。这意味着像这样的查询:

SELECT col4, col5
FROM tablename
GROUP BY col1, col2, col3

在行选择方面相当于 Postgresql 的 DISTINCT ON 查询。但是,返回的行是不可预测的。

适配 MySQL

为了确保可预测性,需要采取有序的方法。尽管使用带有 ORDER BY 的子查询很有吸引力,但 MySQL 的优化器可能不会尊重它。

更可靠的方法是:

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

此查询查找第一个遇到的满足 DISTINCT ON 的行Postgresql 中的条件通过使用相关子查询来检索每个组的最小 col4 值。

结论

虽然 Postgresql 的 DISTINCT ON 查询在 MySQL 中没有直接对应项,有解决方法。方法的选择取决于具体的查询和所需的复杂程度。

以上是如何在MySQL中实现Postgresql的DISTINCT ON功能?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn