2010-09-28 4 views
0

Когда я запускаю этот запрос:Почему этот запрос не работает?

SELECT m.tag_id, m.product_id, count(m.product_id) as dups 
FROM product_tag_map m 
INNER JOIN category_tag_map s ON s.tag_id = m.tag_id 
INNER JOIN cart_product p ON m.product_id = p.product_id 
WHERE m.product_id = p.product_id 
AND s.category_id =508 
AND s.include =1 
AND dups = (SELECT count(s.category_id) as cats FROM category_tag_map s WHERE s.category_id =508) 
GROUP BY m.product_id 
ORDER BY dups DESC 

Я получаю эту ошибку:

1054 - Unknown column 'dups' in 'where clause'

Если я беру Dups из где положение я получаю это:

tag_id product_id dups 
2 7038 2 
2 1294 1 

Я предполагаю, что я не может использовать поле dups в предложении where, потому что это поле генерируется «на лету». Итак, как я могу сделать то, что я пытаюсь сделать тогда?

ответ

3

Поскольку вы фильтруете агрегат, вам необходимо использовать Having. MySQL на самом деле позволяет ссылаться на псевдонимы столбцов в статье, имеющей (большинство других СУБД не позволяют это)

SELECT m.tag_id, m.product_id, count(m.product_id) as dups 
FROM product_tag_map m 
INNER JOIN category_tag_map s ON s.tag_id = m.tag_id 
INNER JOIN cart_product p ON m.product_id = p.product_id 
WHERE m.product_id = p.product_id 
AND s.category_id =508 
AND s.include =1 
GROUP BY m.product_id 
HAVING dups = (SELECT count(s.category_id) as cats FROM category_tag_map s WHERE s.category_id =508) 
ORDER BY dups DESC 
+0

Это, кажется, работает! :) –

1

Dups это просто псевдоним для результата count() .. я не уверен, если вы можете использовать count(m.product_id)=(SELECT ...) в пункте в WHERE, если не я бы сказал, что вы могли бы проверить его в HAVING пунктом