1

我有两个表:产品和项目。我想根据列选择distinct属于产品的项目condition,按price ASC.

+-------------------+
| id | name         |
+-------------------+
| 1 | Mickey Mouse  |
+-------------------+

+-------------------------------------+
| id | product_id | condition | price |
+-------------------------------------+
| 1  | 1           | New       | 90   |
| 2  | 1           | New       | 80   |
| 3  | 1           | Excellent | 60   |
| 4  | 1           | Excellent | 50   |
| 5  | 1           | Used      | 30   |
| 6  | 1           | Used      | 20   |
+-------------------------------------+

期望的输出:

+----------------------------------------+
| id | name          | condition | price |
+----------------------------------------+
| 2  | Mickey Mouse  | New       | 80    |
| 4  | Mickey Mouse  | Excellent | 50    |
| 6  | Mickey Mouse  | Used      | 20    |
+----------------------------------------+

这是查询。它返回六个记录而不是所需的三个:

SELECT DISTINCT(items.condition), items.price, products.name
FROM products
INNER JOIN items ON products.id = items.product_id
WHERE products.id = 1
ORDER BY items."price" ASC, products.name;
4

4 回答 4

3

SQL中没有distinct()函数。您的查询被解析为

SELECT DISTINCT (items.condition), ...

这相当于

SELECT DISTINCT items.condition, ...

DISTINCT适用于整行 - 如果两行或多行都具有相同的字段值,则从结果集中删除“重复”行。

你可能想要更多类似的东西

SELECT items.condition, MIN(items.price), products.name
FROM ...
...
GROUP BY products.id
于 2013-07-08T14:47:22.203 回答
3

正确的 PostgreSQL 查询:

SELECT DISTINCT ON (items.condition) items.id, items.condition, items.price, products.name
FROM products
INNER JOIN items ON products.id = items.product_id
WHERE products.id = 1
ORDER BY items.condition, items.price, products.name;

SELECT DISTINCT ON ( expression [, ...] ) 只保留给定表达式计算结果为相等的每组行的第一行。

细节here

于 2013-07-08T14:57:24.277 回答
2

我想根据条件列选择属于产品的不同项目,按价格排序ASC

你很可能想要DISTINCT ON

SELECT *
FROM  (
   SELECT DISTINCT ON (i.condition)
          i.id AS item_id, p.name, i.condition, i.price
   FROM   products p
   JOIN   items    i ON i.products.id = p.id
   WHERE  p.id = 1
   ORDER  BY i.condition, i.price ASC
   )   sub
ORDER  BY item_id;

由于 的前导列ORDER BY必须与 中使用的列相匹配DISTINCT ON,因此您需要一个子查询来获取您显示的排序顺序。

更好的是:

SELECT i.item_id, p.name, i.condition, i.price
FROM  (
   SELECT DISTINCT ON (condition)
          id AS item_id, product_id, condition, price
   FROM   items
   WHERE  product_id = 1
   ORDER  BY condition, price
   )   i
JOIN   products p ON p.id = i.product_id
ORDER  BY item_id;

应该快一点。

旁白:您不应该使用非描述性名称id作为标识符。使用item_idandproduct_id代替。

此相关答案中的更多详细信息、链接和基准测试:
选择每个 GROUP BY 组中的第一行?

于 2013-07-08T15:07:38.863 回答
0

使用 SELECT GROUP BY,仅提取每个 PRODUCT/CONDITION 的 MIN(price)。

于 2013-07-08T14:47:16.943 回答