将 SELECT DISTINCT ON 查询从 Postgresql 转换为 MySQL

2024-04-17

我一直在使用PostgreSQL现在迁移到MySQL.

在我的查询中,我正在使用PostgreSQL's SELECT DISTINCT ON (col1, col2, col3),我想知道这句话是否有对应的内容MySQL.


没有完全等效的方法可以将使用 SELECT DISTINCT ON 的 Postgresql 查询转换为 MySQL。

Postgresql SELECT DISTINCT ON

在 Postgresql 中,以下查询将消除表达式所在的所有行(col1, col2, col3)匹配,并且它只会为每组匹配的行保留“第一个 col4,col5 行”:

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

所以如果你的表是这样的:

col1 | col2 | col3 | col4 | col5
--------------------------------
1    | 2    | 3    | 777  | 888
1    | 2    | 3    | 888  | 999
3    | 3    | 3    | 555  | 555

我们的查询将仅保留 (1,2,3) 的一行和 (3,3,3) 的一行。结果行将是:

col4 | col5
-----------
777  | 888
555  | 555

请注意,每个集合的“第一行”是不可预测的,除非我们指定 ORDER BY,否则我们的第一行也可能是 (888, 999):

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

(表达式上的 DISTINCT 必须与最左边的 ORDER BY 表达式匹配,但 ORDER BY 可以包含其他表达式)。

MySQL 对 GROUP BY 的扩展

MySQL 扩展了使用GROUP BY http://dev.mysql.com/doc/refman/5.0/en/group-by-handling.html这样我们就可以选择 GROUP BY 子句中未命名的非聚合列。每当我们选择非聚合列时,服务器都可以自由地从该列的每个组中选择任何值,因此结果值将是不确定的。

所以这个 Postgresql 查询:

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

可以被认为等同于这个 MySQL 查询:

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

Postgresql 和 MySQL 都会为每个(col1、col2、col3)返回“第一行”,并且在这两种情况下,返回的行都是不可预测的,因为我们没有指定和 order by 子句。

很多人很想用 ORDER BY 转换这个 Postgresql 查询:

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

与这个:

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

这里的想法是将 ORDER BY 应用于子查询,以便当 MySQL 按 col1、col2、col3 分组时,它将保留第一个遇到的 col4 和 col5 值。这个想法是好的,但却是错误的!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 查询转换为 MySQL 查询,但有很多解决方法,结果查询可能与原始查询一样简单,也可能变得非常复杂,但这取决于查询本身。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 SELECT DISTINCT ON 查询从 Postgresql 转换为 MySQL 的相关文章

  • 获取jdbc中表依赖顺序

    我在 MySQL 数据库中有一组表 A B C D 依赖关系如下 B gt C gt A 和 D gt A 也就是说 A 有一个 PrimaryKey C 有一个外键指向 A 的主键 B 有一个外键指向 C 的主键 类似地 D 有一个外键指
  • MySQL INSERT 无需指定每个非默认字段(#1067 - “表”的默认值无效)

    我已经见过好几次了 我有一台服务器允许我插入一些值 而无需指定其他值 如下所示 INSERT INTO table SET value a a value b b value c 是一个没有设置默认值的字段 但在这里工作正常 当脚本移动到新
  • BigDecimal 的 JPA @Size 注释

    我该如何使用 SizeMySQL 的注释DECIMAL x y 列 我在用着BigDecimal 但是当我尝试包括 Size max它不起作用 这是我的代码 Size max 7 2 Column name weight private B
  • 从本地 html/javascript 网站插入 mySQL 数据库

    我正在尝试做什么 我的程序的目的是插入数据local HTML JS网站变成online 非本地 mySQL数据库 到目前为止我尝试过的 我试图用来实现此目的的原始方法是让我的本地网站使用 javascript 通过在线发布数据PHP文件
  • 如何使用Peewee查询多个相似的数据库?

    我遇到了使用 Peewee 查询多个数据库的问题 我有 2 个现有的 mysql 数据库 让我们将它们命名为 A 和 B 结构相似 因为它是两个 Bugzilla 数据库 我使用 Pwiz 生成模型 modelsA py 和 modelsB
  • 如何找到查询结果的大小

    我在 Rails 中有以下查询 records Record select y id source where source gt source y id gt y id group y id source having count 1 如
  • 在单个查询中设置和选择?

    我想知道是否可以在单个查询中设置和选择 像这样的事情 SET LOCAL search path TO 1 SET LOCAL ROLE user SELECT from posts 你可以这样做 with some set as sele
  • 自动将范围内的值插入表中

    是否可以使用 MySQL 语句自动将值插入表中 即从 30 到 200 这是一个应该执行此操作的存储过程 CREATE PROCEDURE insert range BEGIN DECLARE i INT DEFAULT 30 WHILE
  • MySQL:记录之间的平均间隔

    假设这张表 id date 1 2010 12 12 2 2010 12 13 3 2010 12 18 4 2010 12 22 5 2010 12 23 如何仅使用 MySQL 查询找到这些日期之间的平均间隔 例如 此表上的计算将是 2
  • 将数据从 MS SQL 导入 MySQL

    我想从 MS SQL Server 导入数据 通过某种正则表达式运行它以过滤掉内容 然后将其导入 MySQL 然后 对于每个查询 我希望显示来自第三个数据库的相关图像 明智地导入和链接 最简单的方法是什么 谢谢 澄清 它是一个 PHP 应用
  • SQL where 连接集必须包含所有值,但可以包含更多值

    我有三张桌子offers sports和连接表offers sports class Offer lt ActiveRecord Base has and belongs to many sports end class Sport lt
  • 如何在 postgreSQL 中从时间戳中减去/添加分钟

    我有以下场景 我有员工登记他们的上班 下班手续 但他们有10分钟的容忍度 我通过这种观点得到的最新条目 CREATE OR REPLACE VIEW employees late entries id created datetime en
  • 展平具有未知列数的子/父数据

    我正在努力寻找存储和表示 SQL MySQL DB 和 C Windows 表单中的数据的最佳方法 我的数据映射到如下所示的类时 public class Parent public string UniqueID get set Key
  • 将程序存储在 phpMyAdmin 中

    我必须将存储过程添加到 MySQL 数据库 问题是托管提供php我的管理员来管理数据库 我在网上搜索了一下 想法是运行创建程序的MySQL本机语句 但由于程序的代码通常可能有 我们必须更改 MySQL 中的分隔符 php我的管理员没有这个选
  • PHP mysql_num_rows 死错误

    我想创建一个页面 用户可以在其中添加他们的信息 我已经创建了该页面 但我真正的问题是代码 我有一些问题 这部分代码
  • 如何对主索引重新编号

    我有一个简单的 MySQL 表 主索引 id 不是一一编号的 1 31 35 100 等 我希望它们的编号如 1 2 3 4 请告诉我该怎么做 我还想指出的是 我知道该操作可能产生的后果 但我只是想整理一下表格 我同意其他方法也可以 但我只
  • php echo 不工作

    我的代码似乎不起作用 单选按钮出现 但旁边什么也没有 似乎 mysql fetch array 由于某种原因无法工作 因为我已经玩过代码并反复测试它以查找代码似乎遇到的位置出现问题并停止工作 有人可以告诉我出了什么问题吗 欢呼声我是新手 最
  • mysql计算唯一行值

    TABLE quotation id clientid 1 25 2 25 3 25 4 25 5 26 如何查询有多少个不同的客户端TABLE quotation 我不希望重复的条目被计算多次 我需要的答案是2 在 1 行中 因为唯一的非
  • 优化mysql中日期类型字段的查询

    我目前准备了以下查询 select sum amount as total from incomes where YEAR date 2019 and MONTH date 07 and incomes deleted at is null
  • mysql中的按位移位

    如何在 MySQL 中进行按位移位 有没有具体的指令或者操作符 如果不是 如何最佳地模拟它 看一下按位运算符MySQL first http dev mysql com doc refman 5 0 en bit functions htm

随机推荐