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

如何在 MySQL 中复制 Postgresql 的 SELECT DISTINCT ON?

Barbara Streisand
Barbara Streisand原创
2024-11-08 16:59:021089浏览

How to Replicate Postgresql's SELECT DISTINCT ON in MySQL?

将 Postgresql 的 SELECT DISTINCT ON 转换为 MySQL

从 Postgresql 迁移到 MySQL 时,可能会遇到需要利用 Postgresql 的 SELECT DISTINCT 转换查询的情况对其 MySQL 的 ON 语句

Postgresql 的 SELECT DISTINCT ON

在 Postgresql 中,SELECT DISTINCT ON 用于根据指定列的唯一组合删除重复行。它消除了所有匹配的行,并只保留每个不同组合的“第一”行。

MySQL 对 GROUP BY 的扩展

MySQL 没有与 SELECT 完全对应的功能与众不同。相反,它采用了 GROUP BY 的扩展,允许选择非聚合列,即使它们没有在 GROUP BY 子句中命名。然而,从每个组中选择哪个值是不可预测的。因此,我们可以在 MySQL 中使用 GROUP BY 来实现类似的效果:

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

此查询将返回每个 (col1, col2, col3) 组合的“第一”行,但具体顺序这些行是不确定的。

维护行顺序

指定返回行的顺序,我们可以使用子查询:

SELECT col4, col5
FROM (
  SELECT col1, col2, col3, col4, col5
  FROM tablename
  ORDER BY col1, col2, col3, col4
) s
GROUP BY col1, col2, col3;

虽然这种方法看起来合乎逻辑,但 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的SELECT DISTINCT ON没有直接翻译到MySQL,使用 GROUP BY 和子查询的解决方法提供了所需的功能。然而,生成的 MySQL 查询可能比 Postgresql 查询更复杂。

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

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