Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将SELECT DISTINCT ON查询从Postgresql转换为MySQL_Mysql_Postgresql_Select_Group By_Distinct - Fatal编程技术网

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

将SELECT DISTINCT ON查询从Postgresql转换为MySQL,mysql,postgresql,select,group-by,distinct,Mysql,Postgresql,Select,Group By,Distinct,我一直在使用PostgreSQL,现在迁移到MySQL 在我的查询中,我使用了PostgreSQL的selectdistinct ON(col1,col2,col3),我想知道在MySQL中是否有类似的语句 您应该迁移到PDO或MSYQLI,而不是MYSQL,因为它已经被弃用了 关于你的问题你能做什么 SELECT DISTINCT col1, col2, col3 或 不能从多个列中选择不同的值。选择“使用查询”时,如下所示 select distinct col1, col2 fro

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

在我的查询中,我使用了PostgreSQL
selectdistinct ON(col1,col2,col3)
,我想知道在MySQL中是否有类似的语句

您应该迁移到PDOMSYQLI,而不是MYSQL,因为它已经被弃用了

关于你的问题你能做什么

   SELECT DISTINCT col1, col2, col3


不能从多个列中选择不同的值。选择“使用查询”时,如下所示

select distinct col1, col2 from table

使用子查询确定顺序,使用外部查询对它们进行分组

正如@a_horse_with_no_name所指出的那样,这是有效的,因为MySQL与其他DBMS不同,允许部分
分组

例如:

CREATE TABLE customer_order
    (`customer` varchar(5), `item` varchar(6), `date` datetime)
;

INSERT INTO customer_order
    (`customer`, `item`, `date`)
VALUES
    ('alice', 'widget', '2000-01-05 00:00:00'),
    ('bob', 'widget', '2000-01-02 00:00:00'),
    ('alice', 'widget', '2000-01-01 00:00:00'),
    ('alice', 'wodget', '2000-01-06 00:00:00')
;
查询每个客户的第一个订单:

select *
from
  (select customer, item, date
  from customer_order
  order by date) c
group by customer
结果:

| CUSTOMER |   ITEM |                           DATE |
|----------|--------|--------------------------------|
|    alice | widget | January, 01 2000 00:00:00+0000 |
|      bob | widget | January, 02 2000 00:00:00+0000 |

没有一个确切的等价物可以将使用SELECT DISTINCT ON的Postgresql查询转换为MySQL

Postgresql在上选择不同的

在Postgresql中,以下查询将删除表达式
(col1,col2,col3)
匹配的所有行,并且它将仅为每组匹配行保留“第一列4,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
请注意,每套的“第一行”是不可预测的,我们的第一行也可能是(888999),除非我们通过以下方式指定订单:

SELECT DISTINCT ON (col1, col2, col3) col4, col5
FROM tablename
ORDER BY col1, col2, col3, col4
SELECT DISTINCT ON (col1, col2, col3) col4, col5
FROM tablename
ORDER BY col1, col2, col3, col4
(DISTINCT on表达式必须匹配最左边的ORDER BY表达式,但ORDER BY可以包含其他表达式)

MySQL扩展到分组依据

MySQL扩展了的使用,因此我们可以选择GROUPBY子句中未命名的非聚合列。无论何时选择非聚集列,服务器都可以从该列的每个组中自由选择任何值,因此结果值将是不确定的

因此,此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)返回“第一行”,在这两种情况下,返回的行是不可预测的,因为我们没有指定and order by子句

很多人都很想通过以下方式转换此Postgresql查询:

SELECT DISTINCT ON (col1, col2, col3) col4, col5
FROM tablename
ORDER BY col1, col2, col3, col4
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
这里的想法是将orderby应用于子查询,这样当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查询,但有很多解决方法,结果查询可能与原始查询一样简单,也可能变得非常复杂,但这取决于查询本身。

您可以尝试
选择不同的concat(col1、col2、col3)从表
中,如果您需要在MySQL中将这三个列组合起来,那么您需要在这三个列上使用“partial”
groupby
(这在任何其他DBMS中都是不允许的)同时,由于更现代的MySQL/MariaDB服务器将遵循SQL标准,因此子查询中的
ORDER BY
很可能也不会更改子查询结果集,即
LIMIT
,这意味着结果可能会更改从较旧的MySQL版本升级到更现代的版本。“一般来说,没有一种确切的方法可以将Postgresql查询转换为MySQL查询,但有很多解决方法”事实上,我发现MySQL的方法是在(col1、col2、col3)上实现
DISTINCT的最简单或最好的本机方法*
语法。。。还因为MariaDB/MySQL可以忽略子查询中的
ORDER BY
的另一个注释。还因为更现代的MySQL/MariaDB服务器将遵循SQL标准,子查询中的
ORDER BY
也可以/将不会更改子查询结果集,即
LIMIT
结果可以更改从较旧的MySQL版本升级到更现代的版本。如果上述查询不起作用,请尝试以下操作:按客户从客户订单组中选择客户,最小(日期)作为最大日期;