За последние 24 часа нас посетили 23349 программистов и 1514 роботов. Сейчас ищут 794 программиста ...

получить значения с изначально одним неизвестным

Тема в разделе "MySQL", создана пользователем rewuxiin, 24 май 2015.

  1. rewuxiin

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

    С нами с:
    17 апр 2012
    Сообщения:
    611
    Симпатии:
    87
    возможно не могу верно сформулировать оттого у самого и не получается сделать выборку
    имеется таблица
    Код (Text):
    1.  
    2. id_feature id_product id_feature_value
    3. 12             14500             135
    4. 13             14500             185
    5. 14             14500             107
    6. 15             14500             180
    7. 16             14500             360
    в ней множество таких продуктов
    необходимо получить id_product с такими же id_feature и id_feature_value как у 14500 но не все,а только те id_feature которых мы задаем.

    на php изначально набросал вот так, как бы это все дело сократить?

    Код (PHP):
    1.  $idFeature1 = 12;
    2.         $idFeature2 = 13;
    3.         $idFeature3 = 11;
    4.        
    5.         $productId = 14500;
    6.        
    7.         $idValueFeature1 = Db::getInstance()->executeS('SELECT `id_feature_value` FROM `'._DB_PREFIX_.'feature_product` WHERE  `id_product` = '.$productId.'  AND `id_feature` = '.$idFeature1.'');
    8.         $idValueFeature2 = Db::getInstance()->executeS('SELECT `id_feature_value` FROM `'._DB_PREFIX_.'feature_product` WHERE  `id_product` = '.$productId.'  AND `id_feature` = '.$idFeature2.'');
    9.         $idValueFeature3 = Db::getInstance()->executeS('SELECT `id_feature_value` FROM `'._DB_PREFIX_.'feature_product` WHERE  `id_product` = '.$productId.'  AND `id_feature` = '.$idFeature3.'');
    10.       
    11.         $idSimilarProduct = Db::getInstance()->executeS('SELECT DISTINCT `id_product` FROM `'._DB_PREFIX_.'feature_product`          
    12.                     WHERE
    13.                 `id_feature_value` IN ('.$idValueFeature1[0]["id_feature_value"].', '.$idValueFeature2[0]["id_feature_value"].', '.$idValueFeature3[0]["id_feature_value"].') AND `id_feature` IN ('.$idFeature1.', '.$idFeature2.', '.$idFeature3.')
    14.                 '); 
     
  2. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    я даже читать ЭТО не буду. просто скажи почему нельзя фичи выбирать не тремя запросами а одним?
     
  3. rewuxiin

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

    С нами с:
    17 апр 2012
    Сообщения:
    611
    Симпатии:
    87
    да у меня тот же вопрос, как бы это сделать выборку одним запросом))
     
  4. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    проскролить вниз и увидеть как ты в другом запросе не стесняешься не делать три запроса а делаешь один :D
     
  5. rewuxiin

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

    С нами с:
    17 апр 2012
    Сообщения:
    611
    Симпатии:
    87
    от где-то мозг ленится соображать
     
  6. rewuxiin

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

    С нами с:
    17 апр 2012
    Сообщения:
    611
    Симпатии:
    87
    попробовал массу вариантов, однако так и не пришел к толковому

    вот например:
    Код (PHP):
    1.         $idSimilarProduct = Db::getInstance()->executeS('SELECT DISTINCT fp.`id_product` FROM `' . _DB_PREFIX_ . 'feature_product` fp
    2.                         WHERE `id_feature_value` IN (SELECT fv.`id_feature_value` FROM `' . _DB_PREFIX_ . 'feature_product` fv
    3.                         WHERE fv.`id_product` = ' . $productId . '
    4.                         AND fv.`id_feature` IN (' . $idFeature1 . ', ' . $idFeature2 . ', ' . $idFeature3 . '))');
    5.  
    или
    Код (PHP):
    1.  $idSimilarProduct = Db::getInstance()->executeS('SELECT DISTINCT fp.`id_product` FROM `' . _DB_PREFIX_ . 'feature_product`  fp                   
    2.                     INNER JOIN `' . _DB_PREFIX_ . 'feature_product` fp1 ON fp1.`id_feature_value` = fp2.`id_feature_value` WHERE  fp.`id_product` = fp1.`id_product` AND fp1.`id_feature` = ' . $idFeature1 . ' OR fp1.`id_feature` = ' . $idFeature2 . ' OR fp1.`id_feature` = ' . $idFeature3 . '                     
    3.                    ');
    выборка происходит но не верно

    вот бестолковый но пример необходимой работоспособности

    Код (PHP):
    1.         $idFeature1 = 12;
    2.         $idFeature2 = 13;
    3.         $idFeature3 = 11;       
    4.  
    5.         $productId = Tools::getValue('id_product');
    6.       
    7.       
    8.         $idValueFeature1 = Db::getInstance()->executeS('SELECT `id_feature_value` FROM `'._DB_PREFIX_.'feature_product` WHERE  `id_product` = '.$productId.'  AND `id_feature` = '.$idFeature1.'');
    9.         $idValueFeature2 = Db::getInstance()->executeS('SELECT `id_feature_value` FROM `'._DB_PREFIX_.'feature_product` WHERE  `id_product` = '.$productId.'  AND `id_feature` = '.$idFeature2.'');
    10.         $idValueFeature3 = Db::getInstance()->executeS('SELECT `id_feature_value` FROM `'._DB_PREFIX_.'feature_product` WHERE  `id_product` = '.$productId.'  AND `id_feature` = '.$idFeature3.'');
    11.     
    12.         $idSimilarProduct1 = Db::getInstance()->executeS('SELECT DISTINCT fp.`id_product` FROM `'._DB_PREFIX_.'feature_product` fp
    13.                     INNER JOIN `' . _DB_PREFIX_ . 'stock_available` sa ON fp.`id_product` = sa.`id_product` AND sa.`quantity` >0
    14.                     WHERE `id_feature_value` = '.$idValueFeature1[0]["id_feature_value"].' AND `id_feature` = '.$idFeature1.'');
    15.       
    16.         $idSimilarProduct2 = Db::getInstance()->executeS('SELECT DISTINCT fp.`id_product` FROM `'._DB_PREFIX_.'feature_product` fp
    17.                     INNER JOIN `' . _DB_PREFIX_ . 'stock_available` sa ON fp.`id_product` = sa.`id_product` AND sa.`quantity` >0
    18.                     WHERE fp.`id_feature_value` = '.$idValueFeature2[0]["id_feature_value"].' AND `id_feature` = '.$idFeature2.'');
    19.          $idSimilarProduct3 = Db::getInstance()->executeS('SELECT DISTINCT fp.`id_product` FROM `'._DB_PREFIX_.'feature_product` fp
    20.                     INNER JOIN `' . _DB_PREFIX_ . 'stock_available` sa ON fp.`id_product` = sa.`id_product` AND sa.`quantity` >0
    21.                     WHERE fp.`id_feature_value` = '.$idValueFeature3[0]["id_feature_value"].' AND `id_feature` = '.$idFeature3.''); 
    и сравнить массивы