Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.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
Sql 如何在Postgres中使用带有通配符的group by_Sql_Postgresql_Group By - Fatal编程技术网

Sql 如何在Postgres中使用带有通配符的group by

Sql 如何在Postgres中使用带有通配符的group by,sql,postgresql,group-by,Sql,Postgresql,Group By,我在Postgres中的代码有问题。我想获取用户表中的所有字段,但只按id分组。这在MySQL和SQLite上运行良好,但在谷歌搜索后,我发现这种行为不属于标准 SELECT u.*, p.*, count(o.id) AS order_count FROM shop_order AS o LEFT JOIN user AS u ON o.user_id = u.id LEFT JOIN userprofile AS p ON p.user_id = u.id WHERE o.shop_id =

我在Postgres中的代码有问题。我想获取用户表中的所有字段,但只按id分组。这在MySQL和SQLite上运行良好,但在谷歌搜索后,我发现这种行为不属于标准

SELECT u.*, p.*, count(o.id) AS order_count
FROM shop_order AS o
LEFT JOIN user AS u ON o.user_id = u.id
LEFT JOIN userprofile AS p ON p.user_id = u.id
WHERE o.shop_id = <shop_id>
GROUP BY u.id
我是一个SQL新手,所以如果这是显而易见的,请温和一些:

您可以使用row\u number将结果限制为每个用户一行:

select  *
from    (
        select  row_number() over (partition by u.id) as rn
        ,       *
        join    user u
        on      sub.user_id = u.id
        join    shop_order so
        on      so.user_id = u.id
        left join
                userprofile up
        on      up.user_id = u.id
        where   so.shop_id = <shop_id>
        ) as SubQueryAlias
where   rn = 1

子查询是必需的,因为Postgres不允许像where子句中的row_number这样的窗口函数。

不幸的是,如果不列出user和userprofile中的所有列,我认为您无法完成此操作。通配符的使用通常被认为是仅用于简单的临时查询,我猜这就是原因之一!MySQL和其他数据库有一个方便的特性,即如果列既不在GROUPBY子句中,也不在聚合函数中,那么每个组中该列的任何值都可以显示在结果中。PostgreSQL有点严格

但通常情况下,表中只有几列足以进行分组。有很多方法可以重写它。或许你可以做的是:

SELECT u.*, p.*, (select count(o.id) FROM shop_order AS o WHERE o.user_id = u.id AND o.shop_id = <shop_id>) AS order_count
FROM user AS u
LEFT JOIN userprofile AS p ON p.user_id = u.id    

您正试图要求数据库计算一些非常不特定的内容 您希望计算订单数量,但希望显示所有详细信息,如果用户配置文件中每个用户包含多行,并且这些行不同,您将为每个u.id获得多行,并且您指定只需要一行
这就是为什么数据库会说“走开,告诉我你真正想要什么”

你的Postgres版本是什么?如果您使用的是Postgres 9.0及以下版本,那么您的代码构造将不会运行。e、 g.这是不允许的:

SELECT
    p.id,
    p.firstname, p.lastname, p.address, -- these auxiliary fields is helpful to program users
    count(*)
FROM
    people p
    JOIN visits v ON p.id = v.person_id
GROUP BY p.id
必须在9.0及以下版本中执行此操作:

SELECT
    p.id,
    p.firstname, p.lastname, p.address, -- these auxiliary fields is helpful to program users
    count(*)
FROM
    people p
    JOIN visits v ON p.id = v.person_id
GROUP BY p.id
    ,p.firstname, p.lastname, p.address; -- these ancillary fields aids the RDBMS on preventing
    -- programmers from accidentally committing the same mistake as MySQL programmers.
若您使用的是Postgres9.1,那个么即使在SELECT子句中有许多字段,您也肯定只能在GROUPBY中使用一个字段,只要分组字段是主键。因此,这将运行:

SELECT
    p.id,
    p.firstname, p.lastname, p.address, -- these auxiliary fields is helpful to program users
    count(*)
FROM
    people p
    JOIN visits v ON p.id = v.person_id
GROUP BY p.id 
-- note that there's no need to repeat the SELECTed fields on GROUP BY clause
Postgres 9.1可以提供便利,因此只允许在GROUP BY子句中包含主键


SQL FIDLE示例:

您使用的是哪个版本的PostgreSQL?我相信这是9.1之前的版本


PostgreSQL还支持您正在寻找的功能,以防您按主键列分组。因此,在这里,升级可能是一个不错的选择。

如果显式列出所有字段而不是使用*,它会起作用吗?如果这是PostgreSQL 9.1,假设id是每个表的主键,如果您按u.id,p.id分组,我希望它能起作用。我可能不应该这样假设,因为在我看来,将一个名为id的列作为每个表的主键是一种可怕的做法,但这似乎是经常做的事情。另外,如果假设一个用户可以在每个商店有多个订单,那么在这种情况下就没有函数依赖关系。OP依赖于MySQL的特定行为,从它遇到的第一行非分组列中选择值-引用这个问题,这在MySQL和SQLite上运行得很好,但在谷歌搜索之后,我发现这种行为不是标准的一部分。假设每个商店每个用户都有多个订单,你提到的9.1功能将不会有帮助,它将有助于订单,因为他在“唯一订单”列上进行聚合。不过,我同意这对用户配置文件没有帮助。用户配置文件的主键需要包含在分组中。商店订单只在聚合中使用这一点很好!
SELECT
    p.id,
    p.firstname, p.lastname, p.address, -- these auxiliary fields is helpful to program users
    count(*)
FROM
    people p
    JOIN visits v ON p.id = v.person_id
GROUP BY p.id 
-- note that there's no need to repeat the SELECTed fields on GROUP BY clause