В 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
Когда категория появляется в более чем одной записи, выбирается только та, которая имеет наименьший идентификатор объекта.
Я использовал идентификатор категории, а не имя, чтобы идентифицировать дубликаты - вместо этого вы можете использовать имя категории, если это важно для вас.
Обратите внимание, что я преобразовал встроенный подзапрос в categories
в обычный join
, так как я нахожу это более читабельным.