Как упорядочить по столбцу из подзапроса, у которого есть индекс для сортировки - PullRequest
0 голосов
/ 29 мая 2020

Я использую (PostgreSQL) 11.8. И я столкнулся с этим запросом и задачей о сортировке продуктов по createdAt, price and numberOfEntries для столбца таблицы владельцев (createdAt и price). У меня есть индекс, и мне нужно его использовать.

create index npdb_swedish_custom_index on products
                    using GIN(to_tsvector('pg_catalog.swedish', name||price||description||brand))


'CREATE INDEX IF NOT EXISTS created_desc_index ON products (created_at DESC NULLS LAST)'
'CREATE INDEX IF NOT EXISTS created_asc_index ON products (created_at ASC NULLS LAST)'
'CREATE INDEX IF NOT EXISTS price_desc_index ON products (price DESC NULLS LAST)'
'CREATE INDEX IF NOT EXISTS price_asc_index ON products (price ASC NULLS LAST)'

Определите проблему, которую я пытаюсь присоединиться к той же таблице, но я не нашел решения, потому что, когда я добавляю ORDER BY sp.price ASC, я сталкиваюсь с

column "sp.price" must appear in the GROUP BY clause or be used in an aggregate function

мой запрос

    SELECT                         
         array_agg(DISTINCT main_products_alias.id) AS ids
        FROM (

            SELECT                         
                    products_alias.id,
                    products_alias.group_identity,
                    products_alias.price,
                    products_alias.extras,
                    products_alias.created_at AS "createdAt"
                    ,COUNT(DISTINCT uip.id) as "numberOfEntries"
                    ,ts_rank_cd(to_tsvector('pg_catalog.swedish', products_alias.name||products_alias.price||products_alias.description||products_alias.brand), to_tsquery('pg_catalog.swedish', 'Barnvagnar|Solskydd')) AS rank


        FROM products products_alias 
        LEFT JOIN product_category cpt on cpt.product_id = products_alias.id
        LEFT JOIN user_ip_product uip on uip.products_id = products_alias.id               

        WHERE to_tsvector('pg_catalog.swedish', products_alias.name||products_alias.price||products_alias.description||products_alias.brand) @@ to_tsquery('pg_catalog.swedish', 'Barnvagnar|Solskydd')             



        GROUP BY products_alias.id
    ) AS main_products_alias

    LEFT JOIN products sp on sp.id = main_products_alias.id
    GROUP BY main_products_alias.group_identity
    ORDER BY sp.price ASC

Только подумайте, что я сделал, это добавить в основной выбор

(array_agg(DISTINCT main_products_alias.created_at))[1]::TIMESTAMP AS created_at_g,

, а затем ORDER BY created_at_g DESC, но в этом случае мои индексы не используются: (

сделать что-нибудь для этого?

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