Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите с запросом. Подсчет соответствий 
V
    Опции темы
johnyc
Дата 23.11.2010, 02:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 5.8.2009

Репутация: нет
Всего: нет



Есть таблица "опций". Каждое соответствие опции товару записано отдельной строкой в базе. Одному товару может соответствовать несколько опций.

Код

prodID    optID
  1         80
  2         80
  3         80
  1         81
  4         80
  5         81




Суть такова, нужно посчитать количество товаров, которым соответствтую выбранные опции.
Для случая когда выбрана одна опция, все просто.

Код

SELECT COUNT(*) FROM table_options WHERE optID = 80


А как быть, если выбрали еще опцию 81, и нужно посчитать те товары, которые включют обе опции?
Заранее спасибо.
PM MAIL   Вверх
Gluttton
Дата 23.11.2010, 03:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начинающий
***


Профиль
Группа: Завсегдатай
Сообщений: 1170
Регистрация: 28.8.2008
Где: Феодосия

Репутация: 24
Всего: 54



Код

SELECT COUNT(prodID) FROM table_options WHERE optID IN (80, 81);


Так?

P.S. COUNT(*) - посчитает вам не только "товары", но и NULL-значения.


--------------------
Слава Україні!
PM MAIL   Вверх
johnyc
Дата 23.11.2010, 03:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 5.8.2009

Репутация: нет
Всего: нет



Цитата(Gluttton @ 23.11.2010,  03:07)
Код

SELECT COUNT(prodID) FROM table_options WHERE optID IN (80, 81);


Не совсем, данный запрос покажет товары которые содержат опцию 80 или 81. А надо только те товары, которые содержат обе опции одновременно.

Я думаю  нужно подключать JOIN, GROUP и SQL_CALC_FOUND_ROWS вместо COUNT, но у меня все равно не получается, считает неверно.


Это сообщение отредактировал(а) johnyc - 23.11.2010, 03:32
PM MAIL   Вверх
Deniz
Дата 23.11.2010, 06:58 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 6
Всего: 44



Код
select prodID, count(distinct optID)
from table_options
where optID in (80, 81, 82)
group by prodID
having count(distinct optID) = 3 -- кол-во опций в optID IN (80, 81, 82)
запрос должен вывести все подходящие товары.
Distinct - если вдруг опцию для товара внесли несколько раз.
Если нужно только кол-во, то добавить select count(*) from (select ...)

Это сообщение отредактировал(а) Deniz - 23.11.2010, 07:00


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
johnyc
Дата 23.11.2010, 07:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 5.8.2009

Репутация: нет
Всего: нет



Отлично, большое спасибо.
Единственный  момент.. данный запрос выдает не общее количество продуктов, а количество опций каждого продукта, т.е. 2 для каждого продукта. Как можно вывести общее количество с помощью count? или все же прибегать к SQL_CALC_FOUND_ROWS ?
Конструкция с вложенным select у меня не работает

Это сообщение отредактировал(а) johnyc - 23.11.2010, 07:33
PM MAIL   Вверх
Deniz
Дата 23.11.2010, 07:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 6
Всего: 44



johnyc, так надо СУБД указывать.


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
johnyc
Дата 23.11.2010, 07:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 5.8.2009

Репутация: нет
Всего: нет



СУБД - mySQL 4 
PM MAIL   Вверх
Deniz
Дата 23.11.2010, 08:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 6
Всего: 44



По данной СУБД не могу подсказать.
Запрос возвращает список всех ИД товара, кол-во строк и есть кол-во товаров.


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
Akina
Дата 23.11.2010, 08:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



Код

select count(distinct prodID)
...




--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
johnyc
Дата 23.11.2010, 08:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 5.8.2009

Репутация: нет
Всего: нет



Цитата

По данной СУБД не могу подсказать.
Запрос возвращает список всех ИД товара, кол-во строк и есть кол-во товаров. 


Да, думаю в такого рода запросе не критично будет использовать SQL_CALC_FOUND_ROWS. Обойдусь без Count'a )
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Составление SQL-запросов | Следующая тема »


 




[ Время генерации скрипта: 0.0489 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.