Процедура SQL, которая возвращает все продукты, принадлежащие отделу, через категорию - PullRequest
0 голосов
/ 28 февраля 2019

По крайней мере, я так думаю.Я не уверен, как вызвать процедуру с правильными параметрами.

Вот процедура SQL:

CREATE PROCEDURE catalog_get_products_on_department(
  IN inDepartmentId INT, IN inShortProductDescriptionLength INT,
  IN inProductsPerPage INT, IN inStartItem INT)
BEGIN
  PREPARE statement FROM
    "SELECT DISTINCT p.product_id, p.name,
                     IF(LENGTH(p.description) <= ?,
                        p.description,
                        CONCAT(LEFT(p.description, ?),
                               '...')) AS description,
                     p.price, p.discounted_price, p.thumbnail
     FROM            product p
     INNER JOIN      product_category pc
                       ON p.product_id = pc.product_id
     INNER JOIN      category c
                       ON pc.category_id = c.category_id
     WHERE           (p.display = 2 OR p.display = 3)
                     AND c.department_id = ?
     ORDER BY        p.display DESC
     LIMIT           ?, ?";

  SET @p1 = inShortProductDescriptionLength;
  SET @p2 = inShortProductDescriptionLength;
  SET @p3 = inDepartmentId;
  SET @p4 = inStartItem;
  SET @p5 = inProductsPerPage;

  EXECUTE statement USING @p1, @p2, @p3, @p4, @p5;
END$$

А вот фрагмент схемы:

enter image description here

Вот что происходит, когда я пытаюсь вызвать процедуру со следующими параметрами:

inDepartmentId: 1,
inShortProductDescriptionLength: 10,
inProductsPerPage: 10,
nStartItem: 1

The following query has failed: "SET @p0='1'; SET @p1='10'; SET @p2='10'; SET @p3='1'; CALL `catalog_get_products_on_department`(@p0, @p1, @p2, @p3); "

MySQL said: #3065 - Expression #1 of ORDER BY clause is not in SELECT list, references column 'turing.p.display' which is not in SELECT list; this is incompatible with DISTINCT

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

Сообщение об ошибке:

MySQL сказал: # 3065 - Выражение # 1 предложения ORDER BY отсутствует в списке SELECT, ссылка на столбец 'turing.p.display' отсутствует в списке SELECT;это несовместимо с DISTINCT

говорит, что необходимо:

a.Добавьте столбец turing.p.display в список столбцов

, чтобы оператор стал:

SELECT DISTINCT p.product_id, p.name,
                 IF(LENGTH(p.description) <= ?,
                    p.description,
                    CONCAT(LEFT(p.description, ?),
                           '...')) AS description,
                 p.price, p.discounted_price, p.thumbnail,
                 p.display 
 FROM            product p
 INNER JOIN      product_category pc
                   ON p.product_id = pc.product_id
 INNER JOIN      category c
                   ON pc.category_id = c.category_id
 WHERE           (p.display = 2 OR p.display = 3)
                 AND c.department_id = ?
 ORDER BY        p.display DESC
 LIMIT           ?, ?";

(примечание добавил новый столбец p.display

или

B. Удалить DISTINCT

Это должно устранить сообщение об ошибке, но может добавить дубликаты к выводу.

c. Удалить ORDER BY полностью

Это, безусловно, устраняет причину ошибкино порядок данных может измениться или даже стать случайным (в зависимости от физической организации таблиц / индексов, версий, фазы луны и т. д.)

Я полагаю, что "a" является лучшим вобщий.

0 голосов
/ 28 февраля 2019

Я думаю, что ошибка довольно очевидна:

ORDER BY p.display DESC

p.display отсутствует в SELECT.Это необходимо, потому что у вас есть SELECT DISTINCT.

. Я думаю, что самый простой способ обойти это - использовать GROUP BY:

select . . .
from . . .
group by p.product_id, p.name, description,
         p.price, p.discounted_price, p.thumbnail
order by max(p.display) desc
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...