gpt4 book ai didi

postgresql - 为什么我必须为 group by 子句提供一个 items.id 列?

转载 作者:行者123 更新时间:2023-11-29 12:29:28 27 4
gpt4 key购买 nike

我想根据 condition 返回唯一项目,按 price asc 排序。我的查询失败是因为 Postgres 希望 items.id 出现在 group by 子句中。如果包含该查询,则返回与 where 子句匹配的所有内容,这不是我想要的。为什么我需要包含该列?

select items.*
from items
where product_id = 1 and items.status = 'in_stock'
group by condition /* , items.id returns everything */
order by items.price asc

| id | condition | price |
--------------------------
| 1 | new | 9 |
| 2 | good | 5 |
| 3 | good | 3 |

我只想要 ID 为 1 和 3 的项目。

更新:这是一个使用下面答案的 fiddle ,它仍然会产生错误:

http://sqlfiddle.com/#!1/33786/2

最佳答案

问题是 PostgreSQL 无法知道您要从哪些 items 记录中获取值;也就是说,它无法判断您想要这个:

| id | condition | price |
--------------------------
| 1 | new | 9 |
| 3 | good | 3 |

不是这个:

| id | condition | price |
--------------------------
| 1 | new | 9 |
| 2 | good | 5 |

要解决这个问题,您需要使用某种聚合函数,例如 MAX:

SELECT MAX(id) AS id,
condition,
MAX(price) AS price
FROM items
WHERE product_id = 1
AND status = 'in_stock'
GROUP BY condition
ORDER BY price ASC

给出:

| id | condition | price |
--------------------------
| 1 | new | 9 |
| 3 | good | 5 |

(此限制是 SQL 标准的一部分,大多数 DBMS 都强制执行。MySQL 是一个异常(exception),它允许您进行查询,但需要注意的是“服务器可以自由地从每个组中选择任何值,因此除非他们相同,所选择的值是不确定的”[ link ].)

关于postgresql - 为什么我必须为 group by 子句提供一个 items.id 列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17665885/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com