@Dark_Dante

Как правильно сделать сложную выборку в Mysql?

Здравствуйте.
Проблема такая.
Есть таблицы
CREATE TABLE `parameters` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `dimension` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=41 DEFAULT CHARSET=utf8ж
CREATE TABLE `param_values` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `value` varchar(255) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `value` (`value`)
) ENGINE=InnoDB AUTO_INCREMENT=228175 DEFAULT CHARSET=utf8;


CREATE TABLE `param_state` (
  `id_param_name` int(11) NOT NULL DEFAULT '0',
  `id_param_value` int(11) NOT NULL DEFAULT '0',
  `id_acessory` int(11) NOT NULL DEFAULT '0',
  `id_category` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id_param_name`,`id_param_value`,`id_acessory`,`id_category`),
  KEY `id_param_value` (`id_param_value`),
  KEY `id_acessory` (`id_acessory`),
  KEY `id_category` (`id_category`),
  CONSTRAINT `param_state_ibfk_1` FOREIGN KEY (`id_param_name`) REFERENCES `parameters` (`id`),
  CONSTRAINT `param_state_ibfk_2` FOREIGN KEY (`id_param_value`) REFERENCES `param_values` (`id`),
  CONSTRAINT `param_state_ibfk_3` FOREIGN KEY (`id_acessory`) REFERENCES `acessories` (`id`),
  CONSTRAINT `param_state_ibfk_4` FOREIGN KEY (`id_category`) REFERENCES `categories` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `acessories` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `artikul` varchar(255) DEFAULT NULL COMMENT 'Артикул детали',
  `name` varchar(255) DEFAULT NULL COMMENT 'Название детали',
  `description` text COMMENT 'Описание',
  `price` float DEFAULT NULL COMMENT 'Последняя цена',
  `lastupd` int(11) DEFAULT NULL COMMENT 'timestamp последнего обновления цены',
  `fullname` varchar(255) DEFAULT NULL COMMENT 'Расширенное название',
  `addtime` int(11) DEFAULT NULL COMMENT 'Время добавления',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=38166 DEFAULT CHARSET=utf8;

CREATE TABLE `categories` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `category` varchar(255) DEFAULT NULL COMMENT 'Название категории',
  `pseudonim` varbinary(255) DEFAULT NULL COMMENT 'Псевдоним страницы',
  PRIMARY KEY (`id`),
  KEY `pseudonim` (`pseudonim`)
) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8;

CREATE TABLE `param_values` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `value` varchar(255) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `value` (`value`)
) ENGINE=InnoDB AUTO_INCREMENT=228175 DEFAULT CHARSET=utf8


В таблице parameters название параметра
В таблице param_values значение параметра
В таблице categories название категории
В таблице acessories записи с товарами
В таблице param_state соотношение категории с записью о товаре, с именем параметра и его значением.

Надо выбрать товары, подходящие под условия фильтра. Делаю так
SELECT a.id, a.`artikul`, a.`name`, a.`description`, a.`fullname`FROM acessories AS a 
INNER JOIN acessory_state AS acs ON acs.`id_acessory`=a.`id`
INNER JOIN categories AS c ON c.`id`=acs.`id_category`
INNER JOIN param_state AS ps ON ps.`id_category`=c.`id` AND ps.`id_acessory`=a.`id`
INNER JOIN parameters AS p ON p.`id`=ps.`id_param_name`
INNER JOIN param_values AS pv ON pv.`id`=ps.`id_param_value`
WHERE ps.`id_category`=1 AND ps.`id_param_value`=3 AND ps.`id_param_name`=16

Но это выборка товара, соответствующего только одному критерию. Как сделать выборку по нескольким параметрам? Добавление дополнительных AND, например AND ps.`id_param_value`=1 AND ps.`id_param_name`=18 приводит к пустой выборке
Уважаемые гуру, подскажите, как правильно это сделать?
  • Вопрос задан
  • 282 просмотра
Пригласить эксперта
Ответы на вопрос 1
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы