Есть вот такая таблица: Код (Text): CREATE TABLE `shop_curr_properties` ( `id` int(11) NOT NULL AUTO_INCREMENT, `product_id` int(11) NOT NULL, `latname` varchar(255) NOT NULL, `value` text, PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=1042725 DEFAULT CHARSET=utf8; В ней такие данные: Код (Text): INSERT INTO `shop_curr_properties` VALUES ('1042691', '120843', 'brand', 'Dailies Aqua'); INSERT INTO `shop_curr_properties` VALUES ('1042692', '120845', 'brand', 'Dailies Aqua'); INSERT INTO `shop_curr_properties` VALUES ('1042712', '120843', 'typeuse', 'Однодневные'); INSERT INTO `shop_curr_properties` VALUES ('1042693', '120845', 'typeuse', '2 недели'); Надо вытащить product_id, где value равно только "Dailies Aqua" и "Однодневные". Код (Text): SELECT DISTINCT product_id FROM shop_curr_properties WHERE value='Dailies Aqua' OR value='Однодневные' Вытаскивает оба product_id Код (Text): SELECT DISTINCT product_id FROM shop_curr_properties WHERE value='Dailies Aqua' AND value='Однодневные' Вообще ничего не вытаскивает Уже голова кипит. Помогите.
Во-первых, у тебя поля id является AUTO_INCREMENT и на него наложен первичный (а он является уникальным) ключ. И в тоже время ты пишешь, что в таблице в этом самом поле id трижды встречается число 1042696. Ты наверно волшебник, потому как такого не может быть, уж не знаю как тебе удалось трижды запихнуть в уникальное поле одинаковое значение. Во-вторых в условии WHERE ты описываешь условия для конкретной строки из б.д. А тебе нужно условие на сравнение значений из разных строк. То есть, на сколько я понял, твой вопрос выглядит примерно так: как мне выбрать все product_id, для которых value является "Однодневные" и "Dailies Aqua". Могу предложить такой запрос: Код (Text): SELECT `product_id` FROM `shop_curr_properties` WHERE `product_id` IN (SELECT DISTINCT(`product_id`) FROM `shop_curr_properties` WHERE `value` = 'Dailies Aqua') AND `value` = 'Однодневные'; Но это всё неправильно. Нужно пересматривать структуру.
Трижды встречается одинаковое число потому что, когда писал пост, запросы копировал, а эти поля просто исправить забыл. Поправил. Предложенный запрос работает, но не подходит. Так как вариантов value может быть далеко не 2. Запрос превратится в монстра)) Может ещё есть какие-нибудь предложения?
Эта структура соответствует EAV. С ней всегда трудно Очевидно, если есть таблица "свойства продукта", то есть и "продукты", где product_id является первичным ключем. Правильный запрос: Код (Text): SELECT `p`.`product_id`, `p`.`product_name` FROM `products` AS `p` INNER JOIN `shop_curr_properties` AS `a1` ON `a1`.`product_id` = `p`.`product_id` INNER JOIN `shop_curr_properties` AS `a2` ON `a2`.`product_id` = `p`.`product_id` WHERE `a1`.`value`='Dailies Aqua' AND `a2`.`value`='Однодневные' сколько условий на атрибуты, столько и заджойненых таблиц!!! Такова суровая действительность.
отличная концепция. свали всё в одну кучу и вытаскивай сложными запросами. =) она явно родилась на хайдоадах...
Спасибо! Последний вариант подошёл, только боюсь на большой базе, будет тяжеловато. Будем тестировать.