Форум программистов
 
Регистрация на форуме тут, о проблемах пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль

Купить рекламу на форуме 15-35 тыс рублей в месяц

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Ответ
 
Опции темы Поиск в этой теме
Старый 08.02.2012, 14:55   #1
Dexes
Пользователь
 
Регистрация: 27.12.2011
Сообщений: 86
По умолчанию Заморочка с where

Есть таблица с параметрами продукта
Код:
CREATE TABLE IF NOT EXISTS `product_params_values` (
  `product_params_id` int(11) NOT NULL AUTO_INCREMENT,
  `product_params_value` varchar(50) NOT NULL,
  `product_params_units` varchar(50) NOT NULL,
  `product_id` int(11) NOT NULL,
  `params_name_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`product_params_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=cp1251 AUTO_INCREMENT=28 ;
product_params_id - id параметра
product_params_value - значение параметра
product_params_units - ед. измерения (тут они роли не играют никакой)
product_id - ссылка на продукт
params_name_id - ссылка на имя параметра
Строки данной таблицы
Код:
INSERT INTO `product_params_values` (`product_params_id`, `product_params_value`, `product_params_units`, `product_id`, `params_name_id`) VALUES
(13, '30', 'см', 558, 22),
(12, '20', 'см', 558, 21),
(10, '10', 'см', 487, 21),
(11, '10', 'см', 487, 22),
(14, '20', 'дюймы', 7, 19),
(15, '16 млн.', '', 7, 23),
(16, 'LCD', '', 7, 20),
(17, '17', '', 76, 19),
(18, '32 млн.', '', 76, 23),
(19, 'Amoled', '', 76, 20),
(20, '23', 'дюймы', 77, 19),
(21, '64 млн.', '', 77, 23),
(22, 'SAmoled', '', 77, 20),
(23, '20', 'дюймы', 78, 19),
(24, '32 млн.', '', 78, 23),
(25, 'SAmoled', '', 78, 20),
(26, 'Да', '', 7, 24),
(27, 'Нет', '', 76, 24);
Так вот, нужно из этой таблицы вывести id продуктов с заданными параметрами, например где тип экрана LCD, количество цветов 16 млн. и диагональ экрана 20 дюймов, известны значения параметров и id имен параметров
сложность вся в том, что 20 дюймов может быть высота, а может быть диагональ.
Т.е. у разных параметров может быть одно значение (для того чтообы не навыводить лишнего имеется id имени параметра).

Мои никчемные попытки:
Код:
Select * 
From product_params_values 
Where ((params_name_id = 23) and ((product_params_value = "16 млн.") or (product_params_value = "32 млн."))) or 
((params_name_id = 20) and (product_params_value = "LCD"))
Естественно не работает и выводит лишнее. (по идее условие что нужен продукт с обязательно с (LCD (params_name_id = 20) и обязательно с (16 млн. или 32 млн. (params_name_id = 23)))

Были еще идеи подобраться с такой стороны
Код:
Select * 
From product_params_values 
Where ((product_params_values.params_name_id = 23) or (product_params_values.params_name_id = 20))
and ((product_params_value = "16 млн.") or (product_params_value = "32 млн.")) and (product_params_value = "LCD")
Но естественно это вообще ничего не выведет.
Dexes вне форума Ответить с цитированием
Старый 08.02.2012, 16:21   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,050
По умолчанию

В предположении, что значения пары product_id и params_name_id не повторяются можно попробовать следующим образом
Код:
SELECT product_id,COUNT(*) AS CountParm
  FROM product_params_values
  WHERE ((params_name_id = 23) and ((product_params_value = "16 млн.") or (product_params_value = "32 млн."))) or
        ((params_name_id = 20) and (product_params_value = "LCD")) OR
        ((params_name_id = 19) and (product_params_value = "20"))
  GROUP BY product_id
  HAVING CountParm=3
Если не надо 3-го условия, то HAVING CountParm=2
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 08.02.2012 в 16:23.
Аватар вне форума Ответить с цитированием
Старый 08.02.2012, 16:44   #3
Dexes
Пользователь
 
Регистрация: 27.12.2011
Сообщений: 86
По умолчанию

А что дает having?)) Точней как связан having с запросом, почему оно работает? (Меня просто гложет дикий интерес)
P.S. Да, product_id и params_name_id в совокупности не повторяются (у каждого продукта один параметр проставлен только один раз), только по отдельности. SQL действительно работает, я просто поражен о_0

Последний раз редактировалось Dexes; 08.02.2012 в 16:55.
Dexes вне форума Ответить с цитированием
Старый 08.02.2012, 16:59   #4
Dexes
Пользователь
 
Регистрация: 27.12.2011
Сообщений: 86
По умолчанию

Разобрался как работает!) Спасибо огромное. Мастер-класс увиден, урок усвоен)
Dexes вне форума Ответить с цитированием
Старый 08.02.2012, 17:03   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,050
По умолчанию

having в данном случае почти то же, что WHERE, только WHERE так напишешь - ошибка синтаксиса будет. СУБД видимо MySQL? Почитайте http://phpclub.ru/mysql/doc/select.html
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 08.02.2012, 17:17   #6
Dexes
Пользователь
 
Регистрация: 27.12.2011
Сообщений: 86
По умолчанию

Именно MySQL, про тонкости Having и Group By я знаю, но вот так применять не умею пока что)))
Dexes вне форума Ответить с цитированием
Ответ
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Заморочка с ZedGraph sputnick Общие вопросы .NET 1 13.09.2010 09:42
Заморочка с дочерними окнами daunito Общие вопросы Delphi 14 17.03.2009 06:12
интерестная заморочка!;) АС Плюшкин Помощь студентам 3 29.10.2007 12:09