Возможно ли сделать выборку?

AS0ft

Новичок
Возможно ли сделать выборку?

Есть 3-и таблицы: товары, дополнительные поля и их значений.
Пример:
Телефон 1, ID:1, и у него 2-ва доп. поля. 1-ое Стандарт связи: GSM (id1) и Виброзвнок: Есть (id3).
Телефон 2, ID:2, и у него 2-ва доп. поля. 1-ое Стандарт связи: CDMA (id2) и Виброзвнок: Есть (id3)
Телефон 3, ID:3, и у него 2-ва доп. поля. 1-ое Стандарт связи: CDMA (id2) и Виброзвнок: Нет (id4)

Клиент делает запрос на поиск телефона по параметрам:
Стандарт связи: CDMA и Виброзвнок: Нет.

Т.е. запрос должен вывести Телефон 3 и исключить Телефон 1 и 2.

Помогите с запросом:
PHP:
$idd='1,2,3';
$idd2='2,4';
$sql = $db->Query("SELECT * FROM shop_fields_value
           WHERE		
                     id_tovara IN (".$idd.") AND 
	     val IN (".$idd2.")
P.S. Структура таблицы shop_fields_value

CREATE TABLE `shop_fields_value` (
`idfield` int(11) NOT NULL default '0',
`id_tovara` int(11) NOT NULL default '0',
`val` text,
PRIMARY KEY (`idfield`,`id_tovara`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;
 

bkonst

.. хочется странного?...
Изменить структуру таблицы, ввести вместо "`val` text" ссылку на таблицу, в которой хранить списки свойств товаров.
 

AS0ft

Новичок
Это и так уже значения

PHP:
CREATE TABLE `shop_fields` (
  `id` int(11) NOT NULL auto_increment,
  `name` text,
  `text_size` smallint(3) unsigned NOT NULL default '0',
  `active` tinyint(1) NOT NULL default '1',
  `pos` smallint(3) unsigned NOT NULL default '1',
  `fieldcat` int(11) NOT NULL default '0',
  `allf` tinyint(1) NOT NULL default '0',
  `fixvalue` tinyint(1) unsigned NOT NULL default '0',
  `search` tinyint(1) unsigned NOT NULL default '0',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=34 ;

-- 
-- Дамп данных таблицы `shop_fields`
-- 

INSERT INTO `shop_fields` VALUES (29, 'Виброзвонок', 3, 1, 2, 43, 1, 1, 0);
INSERT INTO `shop_fields` VALUES (30, 'Память', 5, 1, 4, 43, 1, 0, 0);
INSERT INTO `shop_fields` VALUES (31, 'Стандарт связи', 10, 1, 1, 42, 1, 1, 1);
INSERT INTO `shop_fields` VALUES (32, 'Тип корпуса', 1, 1, 3, 43, 1, 1, 1);
INSERT INTO `shop_fields` VALUES (33, 'Антена', 1, 1, 5, 43, 1, 1, 1);

CREATE TABLE `shop_fields_value` (
  `idfield` int(11) NOT NULL default '0',
  `id_tovara` int(11) NOT NULL default '0',
  `active` tinyint(1) NOT NULL default '1',
  `val` text,
  `articlecat` int(11) NOT NULL default '0',
  `articlecat_2` int(10) unsigned NOT NULL default '0',
  PRIMARY KEY  (`idfield`,`id_tovara`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;

-- 
-- Дамп данных таблицы `shop_fields_value`
-- 

INSERT INTO `shop_fields_value` VALUES (31, 212, 1, '2', 42, 42);
INSERT INTO `shop_fields_value` VALUES (33, 211, 1, '20', 42, 43);
INSERT INTO `shop_fields_value` VALUES (30, 211, 1, '24', 42, 43);
INSERT INTO `shop_fields_value` VALUES (32, 211, 1, '16', 42, 43);
INSERT INTO `shop_fields_value` VALUES (29, 211, 1, '14', 42, 43);
INSERT INTO `shop_fields_value` VALUES (31, 211, 1, '1', 42, 43);
INSERT INTO `shop_fields_value` VALUES (33, 208, 1, '20', 42, 43);
INSERT INTO `shop_fields_value` VALUES (30, 208, 1, '64', 42, 43);
INSERT INTO `shop_fields_value` VALUES (32, 208, 1, '16', 42, 43);
INSERT INTO `shop_fields_value` VALUES (29, 208, 1, '14', 42, 43);
INSERT INTO `shop_fields_value` VALUES (31, 208, 1, '2', 42, 43);
INSERT INTO `shop_fields_value` VALUES (29, 212, 1, '14', 42, 42);
INSERT INTO `shop_fields_value` VALUES (32, 212, 1, '16', 42, 42);
INSERT INTO `shop_fields_value` VALUES (30, 212, 1, '64', 42, 42);
INSERT INTO `shop_fields_value` VALUES (33, 212, 1, '19', 42, 42);
INSERT INTO `shop_fields_value` VALUES (31, 209, 1, '1', 44, 44);
INSERT INTO `shop_fields_value` VALUES (29, 209, 1, '15', 44, 44);
INSERT INTO `shop_fields_value` VALUES (32, 209, 1, '16', 44, 44);
INSERT INTO `shop_fields_value` VALUES (31, 213, 1, '1', 44, 43);
INSERT INTO `shop_fields_value` VALUES (29, 213, 1, '14', 44, 43);
INSERT INTO `shop_fields_value` VALUES (32, 213, 1, '18', 44, 43);
INSERT INTO `shop_fields_value` VALUES (30, 213, 1, '12', 44, 43);
INSERT INTO `shop_fields_value` VALUES (33, 213, 1, '20', 44, 43);
INSERT INTO `shop_fields_value` VALUES (30, 209, 1, '12', 0, 0);
INSERT INTO `shop_fields_value` VALUES (33, 209, 1, '20', 0, 0);

CREATE TABLE `shop_fixfields_value` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `idfield` int(11) NOT NULL default '0',
  `val` text,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=21 ;

-- 
-- Дамп данных таблицы `shop_fixfields_value`
-- 

INSERT INTO `shop_fixfields_value` VALUES (1, 31, 'GSM 900/1800');
INSERT INTO `shop_fixfields_value` VALUES (2, 31, 'CDMA');
INSERT INTO `shop_fixfields_value` VALUES (14, 29, 'есть');
INSERT INTO `shop_fixfields_value` VALUES (15, 29, 'нет');
INSERT INTO `shop_fixfields_value` VALUES (16, 32, 'Раздвижной');
INSERT INTO `shop_fixfields_value` VALUES (17, 32, 'Книжка');
INSERT INTO `shop_fixfields_value` VALUES (18, 32, 'Классический');
INSERT INTO `shop_fixfields_value` VALUES (19, 33, 'Встроеная');
INSERT INTO `shop_fixfields_value` VALUES (20, 33, 'Наружная');
 

bkonst

.. хочется странного?...
О. Тогда придется умножать табличку саму на себя; что-то вроде
Код:
SELECT a.id_tovara
  FROM shop_fields_value a, shop_fields_value b
  WHERE        
    a.id_tovara IN (".$idd.") AND 
    a.id_tovara = b.id_tovara AND
    a.val = "2" AND
    b.val = "4"
Причем при усложнении запроса количество табличек в FROM будет увеличиваться.
 

AS0ft

Новичок
Такое решение не подходит, может еще с чем поможете?
Спасибо.
 
Сверху