![]() |
Задавайте вопросы, мы ответим
Вы не зашли.
Страниц: 1
SELECT count(DISTINCT p.goods_id, fe.f_id) as cnt, fe.f_id FROM goods AS p INNER JOIN catalog_product_filter_eav AS fe ON p.goods_id = fe.p_id WHERE p.cat_id='10' GROUP BY fe.f_id

выводит количество товаров в каждом фильтре (cnt - количество товаров с атрибутом, f_id -id атрибута)
это таблица catalog_product_filter_eav
При выборе атрибута я сокращаю список выводимых товаров
SELECT * FROM goods as p INNER JOIN catalog_product_filter_eav AS fe ON p.goods_id = fe.p_id WHERE p.cat_id='10' AND fe.f_id = '10'
и соответственно мы видим только тот товар, который имеет выбранный атрибут, но и этот товар имеет свои атрибуты, и что бы их вывести нужно повторить первый запрос, исключив выбранный атрибут и посчитать количество товаров у каждого атрибута, но, я не знаю как.
SELECT count(DISTINCT p.goods_id, fe.f_id) as cnt, fe.f_id FROM goods AS p INNER JOIN catalog_product_filter_eav AS fe ON p.goods_id = fe.p_id WHERE p.cat_id='10' and fe.f_id <> 10 GROUP BY fe.f_id

Этот запрос исключает атрибут №10 из списка, но другие атрибуты тоже остались, а должны остаться только 7 и 8 с количеством 1.
Неактивен
вот код который решает эту проблему
SELECT count(DISTINCT p.goods_id, fe.f_id) as cnt, fe.f_id FROM ew_goods AS p INNER JOIN ew_catalog_product_filter_eav AS fe ON p.goods_id = fe.p_id INNER JOIN ew_catalog_product_filter_eav AS fe0 ON fe0.p_id = p.goods_id WHERE fe.f_id NOT IN (10) and p.cat_id='10' and fe0.f_id = 10 GROUP BY fe.f_id
может это не лучший вариант, но как еще то можно?
Неактивен

Кажется, нормальное решение вполне. Что Вас смущает?
Неактивен
paulus написал:
Кажется, нормальное решение вполне. Что Вас смущает?
просто на каждый атрибут нужно плодить соединение, а их, атрибутов штук до 10 может быть
INNER JOIN ew_catalog_product_filter_eav AS fe0 ON fe0.p_id = p.goods_id
INNER JOIN ew_catalog_product_filter_eav AS fe1 ON fe1.p_id = p.goods_id и т.д.
Неактивен

Да, объединений будет много — это неизбежное следствие нормализации данных.
Если не хватает производительности — тогда нужно задумываться о денормализации,
но готового универсального решения, разумеется, нету.
Неактивен
SELECT SUM(p.in_stock) as in_stock, SUM(p.in_stock_shop) as in_stock_shop, SUM( p.in_stock_custom) as in_stock_custom, SUM(p.is_best) as best, SUM(p.is_new) as new, SUM(p.is_hot) as hot, SUM(p.is_promote) as promote FROM goods AS p INNER JOIN catalog_product_filter_eav AS fe ON p.goods_id = fe.p_id INNER JOIN catalog_product_filter_eav AS fe0 ON fe0.p_id = p.goods_id INNER JOIN catalog_product_filter_eav AS fe1 ON fe1.p_id = p.goods_id INNER JOIN catalog_product_filter_eav AS fe2 ON fe2.p_id = p.goods_id WHERE p.cat_id='10' AND fe0.f_id = '7' AND fe1.f_id = '2' AND fe2.f_id = '10'
выводит неверные SUM(p.in_stock) и т.д. (там 0 или 1), по количеству товаров считает соответственно.
при это аналогичный запрос правильно выводит товары, что у меня не так то.
SELECT SQL_CALC_FOUND_ROWS DISTINCT p.* FROM goods as p INNER JOIN catalog_product_filter_eav AS fe ON p.goods_id = fe.p_id INNER JOIN ew_catalog_product_filter_eav AS fe0 ON fe0.p_id = p.goods_id INNER JOIN ew_catalog_product_filter_eav AS fe1 ON fe1.p_id = p.goods_id INNER JOIN ew_catalog_product_filter_eav AS fe2 ON fe2.p_id = p.goods_id WHERE p.cat_id='10' AND fe0.f_id = '7' AND fe1.f_id = '2' AND fe2.f_id = '10' ORDER BY `goods_name` asc LIMIT 10
Неактивен

Одной группировкой не отделаетесь, разумеется — представьте себе, какие
строки у Вас получатся без группировки. Прийдется писать подзапросы ![]()
Неактивен
на что оно похоже, как абстрактный пример
Неактивен

SELECT p.name, (SELECT SUM(subtable.value) FROM subtable WHERE subtable.id = p.id) sum_sub1, ...
FROM goods p
WHERE категории
Просто иначе Вы получаете произведения строк, а не то, что Вам нужно.
Неактивен
то есть зараз посчитать все поля невозможно?
Неактивен
тогда может есть смысл выбрать необходимые поля в массив, штук до 300 максимум, и свернуть? Все равно потом закешировано будет на часа 3.
Неактивен
все таки не могу понять
log: SELECT SUM(p.in_stock) as in_stock, SUM(p.in_stock_shop) as in_stock_shop, SUM( p.in_stock_custom) as in_stock_custom, SUM(p.is_best) as best, SUM(p.is_new) as new, SUM(p.is_hot) as hot, SUM(p.is_promote) as promote FROM goods AS p WHERE p.cat_id='10' AND is_delete=0 AND is_on_sale=1
выводит правильные значения
более того,
SELECT * FROM ew_goods AS p WHERE p.cat_id='10'
и
SELECT DISTINCT p.goods_id, p.* FROM goods AS p INNER JOIN catalog_product_filter_eav AS fe ON p.goods_id = fe.p_id INNER JOIN catalog_product_filter_eav AS fe0 ON fe0.p_id = p.goods_id WHERE p.cat_id='10' AND is_delete=0 AND is_on_sale=1 AND fe0.f_id = '7'
выводит полностью аналогичный результат. А посчитать не удается.
Отредактированно ustasby (08.11.2010 20:27:26)
Неактивен

Вы DISTINCT уберите, чтобы увидеть данные, которые реально считаете,
тогда будет понятно, почему результат не аналогичный ни разу ![]()
Кстати, тут подумал, что, возможно правильный результат выдаст
SELECT SUM(DISTINCT sub1.field), ...
Точнее — правильным он будет, если все строки sub1.field выдают разные
значения. Но это, разумеется, та же группировка внутри скобок — просто
вырожденный случай.
Неактивен
спасибо, там есть на складе или нет 1-0, решил выбрать строки и подсчитать в цикле, рядов много не будет, сработает быстро
Неактивен
жалко что sum(DISTINCT p.goods_id, p.in_stock) не работает
Неактивен
Страниц: 1