SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 08.11.2010 13:15:20

ustasby
Участник
Зарегистрирован: 08.11.2010
Сообщений: 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'  GROUP BY fe.f_id

http://habreffect.ru/files/690/bfb503a50/q2.png
выводит количество товаров в каждом фильтре (cnt - количество товаров с атрибутом, f_id -id атрибута)

http://habreffect.ru/files/715/4ac38a74d/q1.png
это таблица 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

http://habreffect.ru/files/d41/523db2793/q3.png
Этот запрос исключает атрибут №10 из списка, но другие атрибуты тоже остались, а должны остаться только 7 и 8 с количеством 1.

Неактивен

 

#2 08.11.2010 13:44:47

ustasby
Участник
Зарегистрирован: 08.11.2010
Сообщений: 10

Re: исключить из выбрки выбранные атрибуты и посчитать количество вхождений

вот код который решает эту проблему

Код:

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

может это не лучший вариант, но как еще то можно?

Неактивен

 

#3 08.11.2010 14:43:43

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: исключить из выбрки выбранные атрибуты и посчитать количество вхождений

Кажется, нормальное решение вполне. Что Вас смущает?

Неактивен

 

#4 08.11.2010 15:53:11

ustasby
Участник
Зарегистрирован: 08.11.2010
Сообщений: 10

Re: исключить из выбрки выбранные атрибуты и посчитать количество вхождений

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 и т.д.

Неактивен

 

#5 08.11.2010 16:40:42

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: исключить из выбрки выбранные атрибуты и посчитать количество вхождений

Да, объединений будет много — это неизбежное следствие нормализации данных.

Если не хватает производительности — тогда нужно задумываться о денормализации,
но готового универсального решения, разумеется, нету.

Неактивен

 

#6 08.11.2010 17:52:59

ustasby
Участник
Зарегистрирован: 08.11.2010
Сообщений: 10

Re: исключить из выбрки выбранные атрибуты и посчитать количество вхождений

Код:

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

Неактивен

 

#7 08.11.2010 19:49:09

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: исключить из выбрки выбранные атрибуты и посчитать количество вхождений

Одной группировкой не отделаетесь, разумеется — представьте себе, какие
строки у Вас получатся без группировки. Прийдется писать подзапросы sad

Неактивен

 

#8 08.11.2010 20:01:10

ustasby
Участник
Зарегистрирован: 08.11.2010
Сообщений: 10

Re: исключить из выбрки выбранные атрибуты и посчитать количество вхождений

на что оно похоже, как абстрактный пример

Неактивен

 

#9 08.11.2010 20:08:45

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: исключить из выбрки выбранные атрибуты и посчитать количество вхождений

SELECT p.name, (SELECT SUM(subtable.value) FROM subtable WHERE subtable.id = p.id) sum_sub1, ...
FROM goods p
WHERE категории

Просто иначе Вы получаете произведения строк, а не то, что Вам нужно.

Неактивен

 

#10 08.11.2010 20:12:00

ustasby
Участник
Зарегистрирован: 08.11.2010
Сообщений: 10

Re: исключить из выбрки выбранные атрибуты и посчитать количество вхождений

то есть зараз посчитать все поля невозможно?

Неактивен

 

#11 08.11.2010 20:18:00

ustasby
Участник
Зарегистрирован: 08.11.2010
Сообщений: 10

Re: исключить из выбрки выбранные атрибуты и посчитать количество вхождений

тогда может есть смысл выбрать необходимые поля в массив, штук до 300 максимум, и свернуть? Все равно потом закешировано будет на часа 3.

Неактивен

 

#12 08.11.2010 20:21:36

ustasby
Участник
Зарегистрирован: 08.11.2010
Сообщений: 10

Re: исключить из выбрки выбранные атрибуты и посчитать количество вхождений

все таки не могу понять

Код:

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)

Неактивен

 

#13 08.11.2010 20:41:23

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: исключить из выбрки выбранные атрибуты и посчитать количество вхождений

Вы DISTINCT уберите, чтобы увидеть данные, которые реально считаете,
тогда будет понятно, почему результат не аналогичный ни разу smile

Кстати, тут подумал, что, возможно правильный результат выдаст
SELECT SUM(DISTINCT sub1.field), ...
Точнее — правильным он будет, если все строки sub1.field выдают разные
значения. Но это, разумеется, та же группировка внутри скобок — просто
вырожденный случай.

Неактивен

 

#14 08.11.2010 20:45:12

ustasby
Участник
Зарегистрирован: 08.11.2010
Сообщений: 10

Re: исключить из выбрки выбранные атрибуты и посчитать количество вхождений

спасибо, там есть на складе или нет 1-0, решил выбрать строки и подсчитать в цикле, рядов много не будет, сработает быстро

Неактивен

 

#15 08.11.2010 20:46:48

ustasby
Участник
Зарегистрирован: 08.11.2010
Сообщений: 10

Re: исключить из выбрки выбранные атрибуты и посчитать количество вхождений

жалко что sum(DISTINCT p.goods_id, p.in_stock) не работает

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson