Я бы хотел сделать что-то подобное. Создайте массив, в котором у меня будут идентификаторы всех выбранных строк.
SELECT p.*,
array_agg(p.id) as places_ids,
(CASE
WHEN EXISTS(
SELECT id
FROM user_favorites uf
WHERE uf.place_id = p.id
AND uf.user_id = :userId
AND uf.deleted_at IS NULL
)
THEN true
ELSE false
END ) AS favorite
FROM (SELECT
DISTINCT ON (urv.object_id)
urv.id as recent_id,
p.id,
p.name,
p.address,
p.pictures
FROM user_recent_visits urv
JOIN places p on urv.object_id = p.id
WHERE urv.user_id = :userId
AND urv.object_type = :type
AND p.deleted_at IS NULL
AND p.status = 2
AND p.active = true
) AS p
GROUP BY p.recent_id, p.id, p.name, p.address
ORDER BY p.recent_id LIMIT 5
РЕДАКТИРОВАТЬ: полная ошибка:
SQLSTATE [42883]: неопределенная функция: 7 ОШИБКА: неизвестный оператор сравнения для typ json LINE 30: ... GROUP BY p.recent_id, p.id, p.name, p.address, ... ^ (SQL: ВЫБРАТЬ p. *, array_agg (json_build_array (p.id)) ) как place_ids, (СЛУЧАЙ, КОГДА СУЩЕСТВУЕТ (ВЫБЕРИТЕ ИД ИЗ user_flected uf ГДЕ uf.place_id = p.id AND uf.user_id =: userId AND uf.deleted_at IS NULL), ЕСЛИ истина, ЛОЖНО КОНЕЦ) КАК ИЗБРАННОЕ ОТ (ВЫБРАТЬ ОТПРАВИТЬ ВКЛ ( urv.object_id) urv.id как недавние_идентификаторы, p.id, p.name, p.address, p.pictures ИЗ user_recent_visits =: type AND p.deleted_at IS NULL AND p.status = 2 AND p.active = true) AS p GROUP BY p.recent_id, p.id, p.name, p.address, p.pictures ORDER BY p.recent_id LIMIT 5)
Но в этом случае у меня ошибка «неизвестный оператор сравнения» . Итак, как написать этот запрос, чтобы получить все идентификаторы в виде массива. Другой вопрос. Можно ли сделать это без GROUP BY?
Спасибо