2015-04-05 2 views
0

Я пытаюсь получить определенное количество продуктов, которые были проданы не менее 6 раз, но mysql дает мне неизвестный столбец, но он упорядочивает по тому же значению, если значение извлекает из WHERE.Неизвестный столбец MYSQL

это мой запрос.

SELECT 
ps.product_id, 
(SELECT IFNULL(SUM(s.product_quantity),0) FROM product_stock s WHERE ps.product_id = s.product_id AND s.product_quantity > 0) AS stock, 
SUM(ps.product_quantity) AS vendidos 
FROM product_sold ps 
WHERE 
ps.product_sold_approved_time >= 1419786999 
AND 
vendidos >= 6 
GROUP BY ps.product_id 
ORDER BY vendidos DESC 

ответ

2

Вы не можете использовать имя псевдонима столбца в условии where. Вы можете переместить его как имеющий пункт

SELECT 
ps.product_id, 
(SELECT IFNULL(SUM(s.product_quantity),0) FROM product_stock s WHERE ps.product_id = s.product_id AND s.product_quantity > 0) AS stock, 
SUM(ps.product_quantity) AS vendidos 
FROM product_sold ps 
WHERE 
ps.product_sold_approved_time >= 1419786999 
GROUP BY ps.product_id 
having vendidos >= 6 
ORDER BY vendidos DESC 
+0

Этот подход лучше, чем выполнение подзапроса в предложении where? Как это SELECT, ps.product_id, (SELECT IFNULL (SUM (s.product_quantity), 0) ОТ product_stock сек WHERE ps.product_id = s.product_id И s.product_quantity> 0) как шток, SUM (пс. product_quantity) КАК vendidos ОТ product_sold пс ГДЕ (SELECT SUM (p.product_quantity) FROM product_sold р ГДЕ p.product_sold_approved_time> = 1419786999 И p.product_id = ps.product_id)> = 6 И ps.product_sold_approved_time> = 1419786999 GROUP BY ps.product_id ORDER BY vendidos DESC – bmacuer

+0

Это зависит от большого набора данных, чтобы избежать подзапроса и иметь надлежащие индексы в столбцах, которые будут использоваться должным образом. Но, поскольку вы спросили его довольно субъективно и полностью зависели от объема данных и используя план объяснения, более подробно об эффективности можно было бы проанализировать. –

1

Вы получаете это, как вы используете alias в where пункте. Порядок выполнения пункта, как это:

FROM clause 
WHERE clause 
GROUP BY clause 
HAVING clause 
SELECT clause 
ORDER BY clause 

Вы запутались здесь, что расчетные SELECT столбцы будут доступны в пункте WHERE, но это не так. Поскольку предложение SELECT выполнено прямо перед рукой, все, начиная с SELECT, должно быть доступно во время выполнения ORDER BY.

Смежные вопросы