Задавайте вопросы, мы ответим
Вы не зашли.
Страниц: 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