Объединить SQL запросы

Тема в разделе "Базы данных", создана пользователем Janine, 5 апр 2018.

Метки:
Модераторы: latteo
  1. Janine

    Janine

    Регистр.:
    17 дек 2007
    Сообщения:
    355
    Симпатии:
    96
    Уважаемые гуру!

    Правлю Опенкарт, возник вопрос по БД.

    Есть один запрос:
    Код:
    $sql = "SELECT DISTINCT ps.product_id, (SELECT AVG(rating) FROM " . DB_PREFIX . "review r1 WHERE r1.product_id = ps.product_id AND r1.status = '1' GROUP BY r1.product_id) AS rating FROM " . DB_PREFIX . "product_special ps LEFT JOIN " . DB_PREFIX . "product p ON (ps.product_id = p.product_id) LEFT JOIN " . DB_PREFIX . "product_description pd ON (p.product_id = pd.product_id) LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id) WHERE p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "' AND ps.customer_group_id = '" . (int)$this->config->get('config_customer_group_id') . "' AND ((ps.date_start = '0000-00-00' OR ps.date_start < NOW()) AND (ps.date_end = '0000-00-00' OR ps.date_end > NOW())) GROUP BY ps.product_id";
    Который отбирает некоторое множество товара, в которых включена и актуальна акционная цена.

    Есть второй запрос:
    Код:
    $sql_offer = "SELECT * FROM " . DB_PREFIX . "product WHERE offer_marker = 1";
    Которым я отбираю товары с определенным свойством.

    Как объединить эти запросы в один?
     
  2. Jays

    Jays Создатель

    Регистр.:
    4 окт 2015
    Сообщения:
    20
    Симпатии:
    2
    Ну тем методом left join,inner join,cross join зависит что вам и как вам надо взять, так как нету свойства таблицы написать запрос очень трудно, для связки нужно знать релейшины между таблицами
     
  3. ogiv

    ogiv Создатель

    Регистр.:
    26 апр 2013
    Сообщения:
    27
    Симпатии:
    3
    можно что-то в таком духе
    SELECT * FROM " . DB_PREFIX . "product WHERE offer_marker = 1 and
    ps.product_id in (тут ваш предыдущий запрос)
     
  4. Janine

    Janine

    Регистр.:
    17 дек 2007
    Сообщения:
    355
    Симпатии:
    96
    Нет, так не работает, да и правильнее было бы UNION использовать.
     
  5. Vallium

    Vallium

    Регистр.:
    22 авг 2014
    Сообщения:
    205
    Симпатии:
    30
    так а в чем проблема? union all с одиннаковым количеством полей и все
     
  6. Janine

    Janine

    Регистр.:
    17 дек 2007
    Сообщения:
    355
    Симпатии:
    96
    Если понимаешь, как должен выглядеть запрос, напиши.
     
  7. Vallium

    Vallium

    Регистр.:
    22 авг 2014
    Сообщения:
    205
    Симпатии:
    30
    навскидку так

    $sql = "SELECT DISTINCT p.*, (SELECT AVG(rating) FROM " . DB_PREFIX . "review r1 WHERE r1.product_id = ps.product_id AND r1.status = '1' GROUP BY r1.product_id) AS rating FROM " . DB_PREFIX . "product_special ps LEFT JOIN " . DB_PREFIX . "product p ON (ps.product_id = p.product_id and p.offer_marker = 1) LEFT JOIN " . DB_PREFIX . "product_description pd ON (p.product_id = pd.product_id) LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id) WHERE p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "' AND ps.customer_group_id = '" . (int)$this->config->get('config_customer_group_id') . "' AND ((ps.date_start = '0000-00-00' OR ps.date_start < NOW()) AND (ps.date_end = '0000-00-00' OR ps.date_end > NOW())) GROUP BY ps.product_id";

    хотя не понимаю в чем смысл объединения
     
  8. Vallium

    Vallium

    Регистр.:
    22 авг 2014
    Сообщения:
    205
    Симпатии:
    30
    наверное неправильно написал - это выборка под оба условия одновременно
    если нужны оба набора данных, то так - смотришь структуру таблицы product и пишешь запрос (набор полей свой поставь)

    $sql = "SELECT
    product_id,model,sku,upc,ean,jan,isbn,mpn,location,quantity,stock_status_id,image,manufacturer_id,shipping,price,points,tax_class_id,date_available,
    weight,weight_class_id,length,width,height,length_class_id,subtract,minimum,sort_order,status,viewed,date_added,date_modified, 0 as rating
    FROM ".DB_PREFIX."product p1 WHERE p1.offer_marker = 1

    union all

    SELECT DISTINCT ps.product_id, 1 as model,1 as sku,1 as upc,1 as ean,1 as jan,1 as isbn,1 as mpn,1 as location,1 as quantity,1 as stock_status_id,1 as image,
    1 as manufacturer_id,1 as shipping,1 as price,1 as points,1 as tax_class_id,1 as date_available,1 as weight,1 as weight_class_id,1 as length,1 as width,
    1 as height,1 as length_class_id,1 as subtract,1 as minimum,1 as sort_order,1 as status,1 as viewed,1 as date_added,1 as date_modified,
    (SELECT AVG(rating) FROM " . DB_PREFIX . "review r1 WHERE r1.product_id = ps.product_id AND r1.status = '1' GROUP BY r1.product_id) AS rating FROM " . DB_PREFIX . "product_special ps LEFT JOIN " . DB_PREFIX . "product p ON (ps.product_id = p.product_id) LEFT JOIN " . DB_PREFIX . "product_description pd ON (p.product_id = pd.product_id) LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id) WHERE p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "' AND ps.customer_group_id = '" . (int)$this->config->get('config_customer_group_id') . "' AND ((ps.date_start = '0000-00-00' OR ps.date_start < NOW()) AND (ps.date_end = '0000-00-00' OR ps.date_end > NOW())) GROUP BY ps.product_id";