MySQL count count

В моем приложении (osCommerce) мне пришлось изменить запрос, который выглядит следующим образом:

SELECT     sql_cache distinct p.products_image,
p.products_subimage1,
pd.products_name,
p.products_quantity,
p.products_model,
p.products_ordered,
p.products_id,
p.products_price,
p.products_date_added,
p.products_weight,
p.products_length,
p.products_width,
p.products_height,
p.products_tax_class_id,
p.products_status,
IF(s.status, s.specials_new_products_price, NULL)             AS specials_new_products_price,
IF(s.status, s.specials_new_products_price, p.products_price) AS final_price
FROM       products p
LEFT JOIN  specials s
ON         p.products_id = s.products_id
LEFT JOIN  products_to_categories p2c
ON         p.products_id=p2c.products_id
LEFT JOIN  products_description pd
ON         p.products_id=pd.products_id
INNER JOIN filter_association_products fap
ON         p.products_id =fap.products_id
LEFT JOIN  products_attributes pa
ON         p.products_id = pa.products_id
WHERE      p.products_status = '1'
AND        date_sub(curdate(),INTERVAL 3000 day) <= p.products_date_added
AND        find_in_set(fap.filter_id,'126, 130')
ORDER BY   p.products_date_added DESC,
pd.products_name

чтобы закончить так, для точных результатов:

AND      fap.filter_id IN (126, 130)
GROUP BY p.products_id
HAVING COUNT(DISTINCT fap.filter_id) = 2;

У меня сейчас проблема в том, что есть следующий запрос, который использует этот новый запрос и дает мне неправильные результаты.

SELECT COUNT( DISTINCT p.products_id ) AS total
FROM products p
LEFT JOIN specials s ON p.products_id = s.products_id
LEFT JOIN products_to_categories p2c
ON p.products_id = p2c.products_id
LEFT JOIN products_description pd
ON p.products_id = pd.products_id
INNER JOIN filter_association_products fap ON p.products_id = fap.products_id
LEFT JOIN products_attributes pa
ON p.products_id = pa.products_id
WHERE p.products_status =  '1'
AND DATE_SUB( CURDATE( ) , INTERVAL 3000 DAY ) <= p.products_date_added
AND fap.filter_id IN ( 126, 130 )
GROUP BY p.products_id
HAVING COUNT( DISTINCT fap.filter_id ) =2
ORDER BY p.products_date_added DESC , pd.products_name

Который вместо того, чтобы дать результат 1 строки с подсчетом всех product_ids в исходном запросе, теперь дает результат нескольких строк (столько же строк, сколько ожидаемое общее количество продуктов) с номером 1 в каждой из них.
Основная проблема, кажется, GROUP BY p.products_id
HAVING COUNT( DISTINCT fap.filter_id ) =2

Есть ли способ изменить исходный запрос, чтобы запрос количества работал правильно, все еще используя AND fap.filter_id IN ( 126, 130 )?

1

Решение

Как предположил Гордон, использование подзапроса должно сработать.
Так как этот запрос похож на запрос о перечислении продуктов, и поскольку вы используете osCommerce, вы столкнетесь с другой основной проблемой, когда измените запрос для использования подзапроса:
Запрос на подсчет результатов разделения страницы не будет выполнен, так как он не поддерживает подзапросы.
Чтобы решить эту проблему, вам также нужно изменить основной код в catalog/includes/classes/split_page_results.php

Изменить:

$count_query = tep_db_query("select count(" . $count_string . ") as total " . substr($this->sql_query, $pos_from, ($pos_to - $pos_from)));

Для того, чтобы:

$count_query = tep_db_query("select count(*) as total from (" . $this->sql_query . ") AS derivedtable1");

Подробнее здесь: http://forums.oscommerce.com/topic/290110-class-splitpageresults/

1

Другие решения

Вам нужно использовать подзапрос, чтобы получить желаемые результаты:

select count(*)
from (<old query here>) s;

Вам нужно агрегировать на уровне идентификатора продукта, чтобы получить продукты, которые соответствуют исходному условию. Подсчет количества таких продуктов требует другой агрегации.

3

По вопросам рекламы [email protected]