Ребят, помогите пожалуйста составить запрос выборки

(Ответов: 0, Просмотров: 511)
  1. [web-developer] Аватар для cOAPerator
    • Регистрация: 22.02.2011
    • Сообщений: 615
    • Репутация: 111
    • Webmoney BL: ?

    структура таблиц

    -- --------------------------------------------------------

    --
    -- Структура таблицы `s_brands`
    --

    CREATE TABLE IF NOT EXISTS `s_brands` (
    `id` int(11) NOT NULL,
    `parent_id` int(11) NOT NULL,
    `title` varchar(255) NOT NULL,
    `description` text NOT NULL,
    `meta_title` varchar(500) NOT NULL,
    `meta_keywords` varchar(500) NOT NULL,
    `meta_description` varchar(500) NOT NULL,
    `url` varchar(255) NOT NULL,
    `image` varchar(255) NOT NULL,
    `is_active` tinyint(1) NOT NULL DEFAULT '1',
    `is_filter` tinyint(1) NOT NULL DEFAULT '0',
    `is_type` tinyint(1) NOT NULL DEFAULT '0'
    ) ENGINE=MyISAM AUTO_INCREMENT=27 DEFAULT CHARSET=utf8;

    -- --------------------------------------------------------

    --
    -- Структура таблицы `s_products`
    --

    CREATE TABLE IF NOT EXISTS `s_products` (
    `id` int(11) NOT NULL,
    `url` varchar(255) NOT NULL DEFAULT '',
    `title` varchar(500) NOT NULL,
    `annotation` text NOT NULL,
    `description` longtext NOT NULL,
    `meta_title` varchar(500) NOT NULL,
    `meta_keywords` varchar(500) NOT NULL,
    `meta_description` varchar(500) NOT NULL,
    `created` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
    `availability` tinyint(1) DEFAULT NULL,
    `external_id` varchar(36) NOT NULL,
    `brand_id` int(11) DEFAULT NULL,
    `position` int(11) NOT NULL DEFAULT '0',
    `visible` tinyint(1) NOT NULL DEFAULT '1',
    `is_active` tinyint(1) NOT NULL DEFAULT '1',
    `is_novelty` tinyint(1) NOT NULL DEFAULT '0',
    `is_bestseller` tinyint(1) NOT NULL DEFAULT '0',
    `is_recommended` tinyint(1) NOT NULL DEFAULT '0'
    ) ENGINE=MyISAM AUTO_INCREMENT=323 DEFAULT CHARSET=utf8;

    -- --------------------------------------------------------

    --
    -- Структура таблицы `s_products_brands`
    --

    CREATE TABLE IF NOT EXISTS `s_products_brands` (
    `product_id` int(11) NOT NULL,
    `brand_id` int(11) NOT NULL
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8;

    -- --------------------------------------------------------

    --
    -- Структура таблицы `s_products_categories`
    --

    CREATE TABLE IF NOT EXISTS `s_products_categories` (
    `product_id` int(11) NOT NULL,
    `category_id` int(11) NOT NULL,
    `base` tinyint(1) NOT NULL DEFAULT '0',
    `position` int(11) NOT NULL
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8;

    -- --------------------------------------------------------

    --
    -- Структура таблицы `s_products_properties`
    --

    CREATE TABLE IF NOT EXISTS `s_products_properties` (
    `product_id` int(11) NOT NULL,
    `property_id` int(11) NOT NULL COMMENT 'property_val_id'
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8;

    -- --------------------------------------------------------

    --
    -- Структура таблицы `s_products_variants`
    --

    CREATE TABLE IF NOT EXISTS `s_products_variants` (
    `id` int(11) NOT NULL,
    `product_id` int(11) NOT NULL,
    `sku` varchar(255) NOT NULL,
    `name` varchar(255) NOT NULL,
    `price` decimal(14,2) NOT NULL DEFAULT '0.00',
    `compare_price` decimal(14,2) DEFAULT NULL,
    `amount` mediumint(9) DEFAULT NULL,
    `position` int(11) NOT NULL,
    `attachment` varchar(255) NOT NULL,
    `external_id` varchar(36) NOT NULL
    ) ENGINE=MyISAM AUTO_INCREMENT=323 DEFAULT CHARSET=utf8;

    -- --------------------------------------------------------

    --
    -- Структура таблицы `s_properties`
    --

    CREATE TABLE IF NOT EXISTS `s_properties` (
    `id` int(11) NOT NULL,
    `group_id` int(11) NOT NULL,
    `title` varchar(255) NOT NULL,
    `description` text NOT NULL,
    `units` varchar(50) NOT NULL,
    `type` tinyint(1) NOT NULL DEFAULT '1',
    `is_expanded` tinyint(1) NOT NULL DEFAULT '1',
    `is_filter` tinyint(1) NOT NULL DEFAULT '0',
    `is_details` tinyint(1) NOT NULL DEFAULT '0',
    `is_brief` tinyint(1) NOT NULL DEFAULT '0'
    ) ENGINE=MyISAM AUTO_INCREMENT=32 DEFAULT CHARSET=utf8;

    -- --------------------------------------------------------

    --
    -- Структура таблицы `s_properties_groups`
    --

    CREATE TABLE IF NOT EXISTS `s_properties_groups` (
    `id` int(11) NOT NULL,
    `title` varchar(255) NOT NULL,
    `is_active` tinyint(1) NOT NULL DEFAULT '1'
    ) ENGINE=MyISAM AUTO_INCREMENT=28 DEFAULT CHARSET=utf8;

    -- --------------------------------------------------------

    --
    -- Структура таблицы `s_properties_values`
    --

    CREATE TABLE IF NOT EXISTS `s_properties_values` (
    `id` int(11) NOT NULL,
    `prop_id` int(11) NOT NULL,
    `title` varchar(255) NOT NULL,
    `is_active` tinyint(1) NOT NULL DEFAULT '1'
    ) ENGINE=MyISAM AUTO_INCREMENT=369 DEFAULT CHARSET=utf8;

    --
    -- Индексы сохранённых таблиц
    --

    --
    -- Индексы таблицы `s_brands`
    --
    ALTER TABLE `s_brands`
    ADD UNIQUE KEY `brand_id` (`id`);

    --
    -- Индексы таблицы `s_products`
    --
    ALTER TABLE `s_products`
    ADD PRIMARY KEY (`id`), ADD KEY `url` (`url`), ADD KEY `brand_id` (`brand_id`), ADD KEY `visible` (`visible`), ADD KEY `position` (`position`), ADD KEY `external_id` (`external_id`), ADD KEY `hit` (`availability`), ADD KEY `name` (`title`(333));

    --
    -- Индексы таблицы `s_products_brands`
    --
    ALTER TABLE `s_products_brands`
    ADD PRIMARY KEY (`product_id`,`brand_id`), ADD KEY `product_id` (`product_id`), ADD KEY `category_id` (`brand_id`);

    --
    -- Индексы таблицы `s_products_categories`
    --
    ALTER TABLE `s_products_categories`
    ADD PRIMARY KEY (`product_id`,`category_id`), ADD KEY `position` (`position`), ADD KEY `product_id` (`product_id`), ADD KEY `category_id` (`category_id`);

    --
    -- Индексы таблицы `s_products_properties`
    --
    ALTER TABLE `s_products_properties`
    ADD PRIMARY KEY (`product_id`,`property_id`), ADD KEY `product_id` (`product_id`), ADD KEY `feature_id` (`property_id`);

    --
    -- Индексы таблицы `s_products_variants`
    --
    ALTER TABLE `s_products_variants`
    ADD PRIMARY KEY (`id`), ADD KEY `product_id` (`product_id`), ADD KEY `sku` (`sku`), ADD KEY `price` (`price`), ADD KEY `stock` (`amount`), ADD KEY `position` (`position`), ADD KEY `external_id` (`external_id`);

    --
    -- Индексы таблицы `s_properties`
    --
    ALTER TABLE `s_properties`
    ADD UNIQUE KEY `brand_id` (`id`);

    --
    -- Индексы таблицы `s_properties_groups`
    --
    ALTER TABLE `s_properties_groups`
    ADD UNIQUE KEY `brand_id` (`id`);

    --
    -- Индексы таблицы `s_properties_values`
    --
    ALTER TABLE `s_properties_values`
    ADD UNIQUE KEY `prop_id` (`id`) USING BTREE;

    --
    -- AUTO_INCREMENT для сохранённых таблиц
    --

    --
    -- AUTO_INCREMENT для таблицы `s_brands`
    --
    ALTER TABLE `s_brands`
    MODIFY `id` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=27;
    --
    -- AUTO_INCREMENT для таблицы `s_products`
    --
    ALTER TABLE `s_products`
    MODIFY `id` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=323;
    --
    -- AUTO_INCREMENT для таблицы `s_products_variants`
    --
    ALTER TABLE `s_products_variants`
    MODIFY `id` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=323;
    --
    -- AUTO_INCREMENT для таблицы `s_properties`
    --
    ALTER TABLE `s_properties`
    MODIFY `id` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=32;
    --
    -- AUTO_INCREMENT для таблицы `s_properties_groups`
    --
    ALTER TABLE `s_properties_groups`
    MODIFY `id` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=28;
    --
    -- AUTO_INCREMENT для таблицы `s_properties_values`
    --
    ALTER TABLE `s_properties_values`
    MODIFY `id` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=369;
    [свернуть]

    Код:
    SELECT DISTINCT p.*, pv.price, pv.compare_price, br.title AS b_title, br.url AS b_url, br.image AS b_image
    FROM s_products AS p, s_products_variants AS pv, s_brands AS br, s_products_brands AS pb, s_properties AS pr, s_products_properties AS prp, s_properties_values AS prv
    WHERE p.is_active = 1
    AND p.id = pv.product_id
     
    AND pb.brand_id = br.id AND p.id = pb.product_id
     
    AND pr.id = prv.prop_id AND prp.property_id = prv.id AND p.id = prp.product_id
     
    AND pv.price <= 25000 AND ( pb.brand_id = 20 )
    AND ( ( ( prv.prop_id = 6 AND prv.id = 27 ) OR ( prv.prop_id = 6 AND prv.id = 28 ) )
    OR ( ( prv.prop_id = 29 AND prv.id = 54 ) )
    Цена и Бренд нормально фильтруются(таблицы одномерные, несвязанные), а вот чекбоксы нет.
    Чекбоксы фильтруют параметры товаров, а это 3 таблицы:
    >> s_products_brands AS pb, s_properties AS pr, s_products_properties AS prp, s_properties_values AS prv
    Связаны они так:
    >> AND pr.id = prv.prop_id AND prp.property_id = prv.id AND p.id = prp.product_id

    Проблема в том, что чекбоксы сгруппированы в группы. Например от чекбоксов приходит массив:
    ключ 6 значения 27,28,29 - где 6 это параметр "полярность", 27,28,29 это id вариантов полярности
    Если отметить 27 и 28 то все ок, выборка расширяется и показывает больше товаров.

    Но если дальше отметить еще один чекбокс в другой группе, например приходит
    ключ 7 значения 30,31,32 - где 7 это параметр "пусковой ток", 30,31,32 это id вариантов пускового тока
    Отмечаем чекбокс 30 выборка снова расширяется, а должна сужать из предыдущие выданные варианты

    Пример того как должно работать - _https:_//www.emex.ru/catalogs/electro/accumulator/?page=1

    Код:
    SELECT DISTINCT
        p.*,
        pv.price,
        pv.compare_price,
        br.title AS b_title,
        br.url AS b_url,
        br.image AS b_image
    FROM
        s_products AS p,
        s_products_variants AS pv,
        s_brands AS br,
        s_products_brands AS pb,
        s_properties AS pr,
        s_products_properties AS prp,
        s_properties_values AS prv
    WHERE p.is_active = 1
     
    AND p.id = pv.product_id
     
    AND p.id = pb.product_id AND pb.brand_id = br.id
     
    AND p.id = prp.product_id AND prv.id = prp.property_id AND prv.prop_id = pr.id
     
    AND pv.price <= 25000 AND ( pb.brand_id = 20 )
    AND prv.prop_id IN (27,28) GROUP BY p.id having count(distinct prv.prop_id) = 2
    AND prv.prop_id IN (54) GROUP BY p.id having count(distinct prv.prop_id) = 1
    ORDER BY p.id LIMIT 300
    пробовал переписывать на join
    Код:
    SELECT DISTINCT p.*, pv.price
    FROM s_products p
    INNER JOIN s_products_variants pv ON (pv.product_id = p.id)
    INNER JOIN s_products_brands pb ON (pb.product_id = p.id) INNER JOIN s_brands br ON (pb.brand_id = br.id)
    INNER JOIN s_products_properties prp ON(prp.product_id = p.id) INNER JOIN s_properties_values prv ON (prv.id = prp.property_id) INNER JOIN s_properties pr ON (pr.id = prv.prop_id)
    WHERE p.is_active = 1
    .....
    результат тот же. выборка неверная ((

    Запилил тестовый сайт http://coaper.beget.tech/catalog/automotive
    Как тестировать то что описано выше:
    1. слева в фильтре выбираем Бренд COUGAR
    2. слева в фильтре выбираем Полярность - прямая
    3. слева в фильтре выбираем Напряжение - 12 вольт
    4. охреневаем от того что выдало, потому что выдача не должна поменяться, все аккумуляторы с прямой полярностью на 12 вольт
    Запрос показанный выше соответственно неверный.
    Последний раз редактировалось cOAPerator; 23.05.2017 в 00:32.
    • 0

Похожие темы

Темы Раздел Ответов Последний пост
Помогите, пожалуйста, составить sql-запрос
Web программирование 3 07.10.2015 03:21
Ребят, помогите с php пожалуйста
Web программирование 9 26.04.2015 17:46
Ребят, помогите с php пожалуйста
Оффтоп и свободные темы 5 25.04.2015 14:39
Ребят кто шарит в K2 помогите пожалуйста
Joomla 9 19.09.2014 19:00
Ребят, программеры, посмотрите пожалуйста вот эти файлы
WordPress 4 31.07.2012 21:23

У кого попросить инвайт?

Вы можете попросить инвайт у любого модератора:

Информеры