postgresql中的非重复列
non-repeating column in postgresql
我的查询是这样的:
SELECT o.id, o.title, oc.category_id,
(SELECT name from categories c where c.id = oc.category_id)
FROM objects o
LEFT JOIN object_categories oc ON oc.object_id = o.id
WHERE type_id = 17
它return是我table喜欢图片
我要return不重复的分类名称。谁能帮帮我?
在 Postgres 中,您可以使用 distinct on
:
SELECT DISTINCT ON(c.id)
o.id,
o.title,
oc.category_id,
c.name,
count(*) over(partition by o.id) cnt
FROM objects o
LEFT JOIN object_categories oc ON oc.object_id = o.id
LEFT JOIN categories c ON c.c.id = oc.category_id
WHERE type_id = 17
ORDER BY c.id, o.id
当一个类别出现在不止一条记录中时,这将只选择具有最小对象 ID 的类别。
我使用类别 ID 而不是名称来识别重复项 - 如果这对您很重要,您可以改用类别名称。
请注意,我将 categories
上的内联子查询转换为常规 join
,因为我发现它更具可读性。
为此,您可以使用 DISTINCT ON 表达式:
https://www.postgresql.org/docs/9.0/sql-select.html#SQL-DISTINCT
我的查询是这样的:
SELECT o.id, o.title, oc.category_id,
(SELECT name from categories c where c.id = oc.category_id)
FROM objects o
LEFT JOIN object_categories oc ON oc.object_id = o.id
WHERE type_id = 17
它return是我table喜欢图片
我要return不重复的分类名称。谁能帮帮我?
在 Postgres 中,您可以使用 distinct on
:
SELECT DISTINCT ON(c.id)
o.id,
o.title,
oc.category_id,
c.name,
count(*) over(partition by o.id) cnt
FROM objects o
LEFT JOIN object_categories oc ON oc.object_id = o.id
LEFT JOIN categories c ON c.c.id = oc.category_id
WHERE type_id = 17
ORDER BY c.id, o.id
当一个类别出现在不止一条记录中时,这将只选择具有最小对象 ID 的类别。
我使用类别 ID 而不是名称来识别重复项 - 如果这对您很重要,您可以改用类别名称。
请注意,我将 categories
上的内联子查询转换为常规 join
,因为我发现它更具可读性。
为此,您可以使用 DISTINCT ON 表达式: https://www.postgresql.org/docs/9.0/sql-select.html#SQL-DISTINCT