ошибка подзапроса в группе при преобразовании из MySQL в PostgresSQL - PullRequest
0 голосов
/ 12 февраля 2020

Я конвертирую свою базу данных из MySQL в PostgresSQL, и у меня есть этот запрос, который пытается отсортировать продукты по самой низкой цене и самой популярной в данном месте. Он отлично работает в MySQL, но в Postgres у меня возникают проблемы с этим запросом:

SELECT products.product_id,
       suppliers.supplier_id,
       product_code.desc_fa,
       products.name_fa,
       MIN(product_supplier.price) AS price,
       SUM(COALESCE(orders.quantity, 0)) AS n_orders
FROM products
JOIN product_code ON product_code.code_id = products.code_id
JOIN product_supplier ON product_supplier.product_id = products.product_id
JOIN suppliers ON suppliers.supplier_id = product_supplier.supplier_id
JOIN product_tags ON product_tags.product_id = products.product_id
JOIN tags ON tags.tag_id = product_tags.tag_id
JOIN product_crop ON product_crop.product_id = products.product_id
JOIN crops ON crops.crops_id = product_crop.crop_id
LEFT JOIN orders
    ON orders.product_id = products.product_id and orders.crop_id = product_crop.crop_id
LEFT JOIN user ON user.user_id = orders.user_id and user.location_id = 883
WHERE crops.crops_id = 1
  AND product_supplier.quantity >= 3
  AND tags.tag = 'علف کش'
GROUP BY products.name_fa 
ORDER BY n_orders DESC
LIMIT 10;

Это дает мне эту ошибку:

column must appear in the GROUP BY clause or be used in an aggregate function 

Любые предложения по как обойти эту ошибку?

ОБНОВЛЕНИЕ : Согласно ответам я смог заставить его работать с помощью этого запроса:

WITH tem_1 AS (SELECT product_id, MIN(price) AS price FROM product_supplier GROUP BY product_id) ,
     tem_2 AS (SELECT product_id, SUM(quantity) AS n_orders FROM orders Group by product_id)
SELECT products.product_id, suppliers.supplier_id, product_code.desc_fa, products.name_fa, tem_1.price, 
products.telegraph, suppliers.location_id, COALESCE(tem_2.n_orders,0) AS quant FROM products
INNER JOIN product_supplier ON product_supplier.product_id = products.product_id
INNER JOIN suppliers ON suppliers.supplier_id = product_supplier.supplier_id
INNER JOIN product_code ON product_code.code_id = products.code_id
INNER JOIN product_crop ON product_crop.product_id = products.product_id
INNER JOIN crops ON crops.crops_id = product_crop.crop_id
INNER JOIN product_tags ON product_tags.product_id = products.product_id
INNER JOIN tags ON tags.tag_id = product_tags.tag_id
INNER JOIN tem_1 ON tem_1.price = product_supplier.price AND tem_1.product_id = products.product_id
LEFT JOIN tem_2 ON tem_2.product_id = products.product_id
WHERE crops.crops_id = 1 AND product_supplier.quantity >= 3 AND tags.tag = 'علف کش'
ORDER BY quant DESC
LIMIT 10;;

Но так как я довольно новичок в SQL Я хотел знать, правильный ли мой код или есть ли лучший способ его реализовать?

1 Ответ

1 голос
/ 12 февраля 2020

Когда вы используете агрегатную функцию (например, SUM, MIN и другие), остальные столбцы в вашем списке полей без агрегатной функции должны быть включены в предложение GROUP BY.

Эти поля:

products.product_id,
suppliers.supplier_id,
product_code.desc_fa,
products.name_fa

должно быть в GROUP BY.

Вместо этого в предложении GROUP BY есть только следующее поле:

products.name_fa 

Вы должны добавить остальные 3 пропущенных поля

В MySql эта ошибка по умолчанию отключена, поэтому ваш запрос работает нормально, но в других СУБД вы находитесь в случае ошибки.

Здесь вы можете увидеть как установить MySql окружение о GROUP BY поведении

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