Я всегда обнаруживал, что при использовании DISTINCT
мои запросы очень сильно затягиваются. Попробуйте использовать GROUP BY
вместо этого. Либо в подзапросе:
SELECT
*
FROM
(
SELECT
"products_displayproduct"."id",
"products_displayproduct"."date_created",
"products_displayproduct"."date_updated",
"products_displayproduct"."name",
"products_displayproduct"."sub_title",
"products_displayproduct"."tags",
"products_displayproduct"."has_multiple_variants",
"products_displayproduct"."placement_id",
"products_displayproduct"."hidden_placement_category_id",
"products_displayproduct"."hidden_placement_super_category_id",
"products_displayproduct"."brand_id",
"products_displayproduct"."poster_image_id",
"products_displayproduct"."rating",
"products_displayproduct"."reviews",
"products_displayproduct"."is_toppick",
"products_displayproduct"."last_amalgamation",
"products_displayproduct"."search_index",
"products_displayproductaccess"."is_instock" as "subquery_instock",
"products_displayproductaccess"."price" as "subquery_price"
FROM
"products_displayproduct"
INNER JOIN "products_displayproductvariant" ON (
"products_displayproduct"."id" = "products_displayproductvariant"."product_id"
)
INNER JOIN "products_displayproductaccess" ON (
"products_displayproductvariant"."id" = "products_displayproductaccess"."product_variant_id"
)
WHERE
(
"products_displayproductaccess"."location_id" IN (
608, 65, 610, 69, 999, 72, 92, 79, 81, 84,
1045, 89, 601, 954, 603, 1276, 605, 607
)
)
GROUP BY
"products_displayproduct"."id"
ORDER BY
"products_displayproduct"."id" ASC NULLS LAST,
"products_displayproductaccess"."is_instock" DESC NULLS LAST,
"products_displayproductaccess"."price" DESC NULLS LAST
) as subquery
ORDER BY
"subquery"."subquery_instock" DESC,
"subquery"."subquery_price" DESC
LIMIT 10
, либо в основном запросе:
SELECT
*
FROM
(
SELECT
"products_displayproduct"."id" as "subquery_id",
"products_displayproduct"."date_created",
"products_displayproduct"."date_updated",
"products_displayproduct"."name",
"products_displayproduct"."sub_title",
"products_displayproduct"."tags",
"products_displayproduct"."has_multiple_variants",
"products_displayproduct"."placement_id",
"products_displayproduct"."hidden_placement_category_id",
"products_displayproduct"."hidden_placement_super_category_id",
"products_displayproduct"."brand_id",
"products_displayproduct"."poster_image_id",
"products_displayproduct"."rating",
"products_displayproduct"."reviews",
"products_displayproduct"."is_toppick",
"products_displayproduct"."last_amalgamation",
"products_displayproduct"."search_index",
"products_displayproductaccess"."is_instock" as "subquery_instock",
"products_displayproductaccess"."price" as "subquery_price"
FROM
"products_displayproduct"
INNER JOIN "products_displayproductvariant" ON (
"products_displayproduct"."id" = "products_displayproductvariant"."product_id"
)
INNER JOIN "products_displayproductaccess" ON (
"products_displayproductvariant"."id" = "products_displayproductaccess"."product_variant_id"
)
WHERE
(
"products_displayproductaccess"."location_id" IN (
608, 65, 610, 69, 999, 72, 92, 79, 81, 84,
1045, 89, 601, 954, 603, 1276, 605, 607
)
)
ORDER BY
"products_displayproduct"."id" ASC NULLS LAST,
"products_displayproductaccess"."is_instock" DESC NULLS LAST,
"products_displayproductaccess"."price" DESC NULLS LAST
) as subquery
GROUP BY
"subquery"."subquery_id"
ORDER BY
"subquery"."subquery_instock" DESC,
"subquery"."subquery_price" DESC
LIMIT 10