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