Postgres - как построить массив в select с идентификаторами всех строк - PullRequest
0 голосов
/ 28 марта 2020

Я бы хотел сделать что-то подобное. Создайте массив, в котором у меня будут идентификаторы всех выбранных строк.

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?

Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...