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