За последние 24 часа нас посетили 17768 программистов и 1606 роботов. Сейчас ищут 1089 программистов ...

Помогите с запросом.

Тема в разделе "MySQL", создана пользователем Fel1ks, 5 май 2012.

  1. Fel1ks

    Fel1ks Активный пользователь

    С нами с:
    24 фев 2010
    Сообщения:
    33
    Симпатии:
    0
    Есть вот такая таблица:
    Код (Text):
    1. CREATE TABLE `shop_curr_properties` (
    2.   `id` int(11) NOT NULL AUTO_INCREMENT,
    3.   `product_id` int(11) NOT NULL,
    4.   `latname` varchar(255) NOT NULL,
    5.   `value` text,
    6.   PRIMARY KEY (`id`)
    7. ) ENGINE=MyISAM AUTO_INCREMENT=1042725 DEFAULT CHARSET=utf8;
    В ней такие данные:
    Код (Text):
    1. INSERT INTO `shop_curr_properties` VALUES ('1042691', '120843', 'brand', 'Dailies Aqua');
    2. INSERT INTO `shop_curr_properties` VALUES ('1042692', '120845', 'brand', 'Dailies Aqua');
    3. INSERT INTO `shop_curr_properties` VALUES ('1042712', '120843', 'typeuse', 'Однодневные');
    4. INSERT INTO `shop_curr_properties` VALUES ('1042693', '120845', 'typeuse', '2 недели');
    Надо вытащить product_id, где value равно только "Dailies Aqua" и "Однодневные".

    Код (Text):
    1. SELECT DISTINCT product_id FROM shop_curr_properties WHERE value='Dailies Aqua' OR value='Однодневные'
    Вытаскивает оба product_id

    Код (Text):
    1. SELECT DISTINCT product_id FROM shop_curr_properties WHERE value='Dailies Aqua' AND value='Однодневные'
    Вообще ничего не вытаскивает

    Уже голова кипит. Помогите.
     
  2. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Во-первых, у тебя поля id является AUTO_INCREMENT и на него наложен первичный (а он является уникальным) ключ. И в тоже время ты пишешь, что в таблице в этом самом поле id трижды встречается число 1042696. Ты наверно волшебник, потому как такого не может быть, уж не знаю как тебе удалось трижды запихнуть в уникальное поле одинаковое значение.
    Во-вторых в условии WHERE ты описываешь условия для конкретной строки из б.д. А тебе нужно условие на сравнение значений из разных строк. То есть, на сколько я понял, твой вопрос выглядит примерно так: как мне выбрать все product_id, для которых value является "Однодневные" и "Dailies Aqua".
    Могу предложить такой запрос:
    Код (Text):
    1. 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` = 'Однодневные';
    Но это всё неправильно. Нужно пересматривать структуру.
     
  3. Fel1ks

    Fel1ks Активный пользователь

    С нами с:
    24 фев 2010
    Сообщения:
    33
    Симпатии:
    0
    Трижды встречается одинаковое число потому что, когда писал пост, запросы копировал, а эти поля просто исправить забыл. Поправил.
    Предложенный запрос работает, но не подходит. Так как вариантов value может быть далеко не 2. Запрос превратится в монстра))
    Может ещё есть какие-нибудь предложения?
     
  4. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    стоит сменить структуру бд
     
  5. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.118
    Симпатии:
    1.245
    Адрес:
    там-сям
    Эта структура соответствует EAV. С ней всегда трудно :)
    Очевидно, если есть таблица "свойства продукта", то есть и "продукты", где product_id является первичным ключем.
    Правильный запрос:
    Код (Text):
    1.  
    2. SELECT `p`.`product_id`, `p`.`product_name`
    3. FROM
    4.   `products` AS `p` INNER JOIN
    5.   `shop_curr_properties` AS `a1` ON `a1`.`product_id` = `p`.`product_id` INNER JOIN
    6.   `shop_curr_properties` AS `a2` ON `a2`.`product_id` = `p`.`product_id`
    7. WHERE
    8.   `a1`.`value`='Dailies Aqua' AND
    9.   `a2`.`value`='Однодневные'
    сколько условий на атрибуты, столько и заджойненых таблиц!!! Такова суровая действительность.
     
  6. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    отличная концепция. свали всё в одну кучу и вытаскивай сложными запросами. =) она явно родилась на хайдоадах...
     
  7. Fel1ks

    Fel1ks Активный пользователь

    С нами с:
    24 фев 2010
    Сообщения:
    33
    Симпатии:
    0
    Спасибо! Последний вариант подошёл, только боюсь на большой базе, будет тяжеловато. Будем тестировать.
     
  8. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.118
    Симпатии:
    1.245
    Адрес:
    там-сям
    не бойся, дальше будет только хуже )))