Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Модификация выборки из нескольких таблиц 
:(
    Опции темы
Serious2008
Дата 9.4.2014, 18:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 294
Регистрация: 28.1.2011

Репутация: нет
Всего: нет



Здравствуйте. Вообще проблема в целом вот такая.
Есть у меня вот такой запрос.

Код

select g.id, pr.price, ifnull(pic1.fname, pic2.fname) as pic,  g.name as name, p.name as parname,
        ifnull(g.text_begin, p.text_begin) as descript, rg.yname,
        rg.artik as vendorid,
        mpar.mparams,
                pp.add as pricedeliv,
                concat(fv3.tid, '_', case when fv1.flt_id=fv2.flt_id then fv1.tid else fv2.tid end, 
'/', case when ifnull(g.tid,'')!='' then g.tid else g.id end) as tflt,
        ifnull(fv1.txt_value, fv2.txt_value) as brand, ifnull(fv1.text2, fv2.text2) as country,
        fv3.id as cat,
        ifnull(fv1.ym, fv2.ym) as brand2,
        fv3.txt_value as categ
from 
goods g 

left join goods p on p.id = g.parent

        left join (pictures pic1,pictures_goods pg1) on g.id=pg1.good_id and pic1.type='foto' and pic1.id=pg1.pic_id
        left join (pictures pic2,pictures_goods pg2) on g.parent=pg2.good_id and pic2.type='foto' and pic2.id=pg2.pic_id
        join (price pr) on g.id=pr.good_id and pr.type='out' and pr.coun=0  and pr.price>1 
        left join (remains_goods rg) on g.id=rg.good_id 
        left join (goods_filters gf1) on g.id=gf1.good_id and gf1.flt_id=3
        left join (filters_values fv1) on gf1.value=fv1.id 
        left join (goods_filters gf2) on p.id=gf2.good_id and gf2.flt_id=3
        left join (filters_values fv2) on gf2.value=fv2.id
        
        left join (goods_filters gf3) on p.id=gf3.good_id and gf3.flt_id=1
        left join (filters_values fv3) on gf3.value=fv3.id 
        left join (price_params pp) on pp.type=fv3.id and pp.brand=ifnull(fv1.id, fv2.id)
                                 and (pr.price between pp.mini and pp.maxi)
        ,
            (select vals.gid id, group_concat( distinct case when (vals.flt_id is null or vals.srt=-1) then null else
            concat(vals.name, '=', ifnull(vals.int_value, ifnull(vals.ym, vals.txt_value)),'||' , vals.ed, '||', digits)
              end  order by vals.srt separator ';' ) mparams
                 from (
                  select g.id gid,
                  group_concat(distinct ifnull(fv.txt_value,fv2.txt_value) order by c.srt separator ', ') txt_value,
                  group_concat(distinct ifnull(fv.text2,fv2.text2) order by fv.srt,fv2.srt separator ' ') text2,
                  group_concat(distinct ifnull(fv.ym,fv2.ym) order by fv.srt,fv2.srt separator ' ') ym,
                  
                 ifnull(gf.int_value, gf2.int_value) int_value,
                 ifnull(gf.flt_id, gf2.flt_id) flt_id,
                c.tid, c.name, f.ed, c.srt, c.digits
                from
                (goods g, cat_filters c, filters f)
                left join goods_filters gf  on gf.good_id=g.id and c.flt_id=gf.flt_id
                left join filters_values fv on fv.id=gf.value
                left join goods_filters gf2  on gf2.good_id=g.parent and c.flt_id=gf2.flt_id
                left join filters_values fv2 on fv2.id=gf2.value
                where
                g.parent is not null
                and c.type =7
                and c.mflt in(select value from goods_filters gff where g.parent=gff.good_id and gff.flt_id=1 )
                and c.flt_id=f.id
                and c.`srt`>-1
                and case when f.type=5 then fv.tid=substring_index(c.tid,'/',-1) else 1=1 end
                and g.id in(select good_id from remains where num>2)
                group by g.id, c.tid,case when f.type=5 then gf.value else '' end

                 ) vals
                group by vals.gid
                ) mpar
 
        WHERE

 g.active=1
 and p.active=1

 and g.parent in(select good_id from goods_filters gf, filters_values fv where fv.flt_id=1 and ifnull(fv.ym,'')!='' and fv.id=gf.value)
 and g.id in(select good_id from remains_goods)
 
 group by g.id

Запрос формировал не я.
Часть которая формирует mpar это сущее извращение и оно адски тормозит весь запрос.

Теперь о том что должно формироваться в mpar

Из таблицы cat_filters выбираются значения вот с таким принципом 
Код

WHERE  `mflt` = fv3.id AND  `type` =7 AND srt>-1

Результат выполнения
user posted image

Теперь дальше из таблицы goods_filters нужно выбрать очень хитрым образом данные.
Нужно выбрать в соответствии с flt_id все данные.
Т.е. условие что-то вроде
Код

WHERE goods_filters.flt_id = cat_filters.flt_id AND (goods_filters.good_id = g.id OR goods_filters.good_id = p.id)


если есть в этой таблице параметр для g.id, то значение для p.id нужно игнорировать.
Т.е. получаем для значения g.id = 3074 и p.id=2074 и cat_filters.flt_id =2943
user posted image
Но в этой ситуации мне необходима только строка 3074

Теперь уже из таблицы filters_values нужно получить значение по столбцу value.
Получаем вот такое.
user posted image

И ещё из таблицы filters, нужно выбрать с подобным уловием WHERE id= cat_filters.flt_id
И получить вот такую вещь. 
user posted image
И в итоге для всех строк которые есть в cat_filter необходимо поставить вот такие строки

"cat_filters.name"+"="+IFNULL(goods_filter.int_value, IFNULL(filters_value.ym,filters_value.txt_value))+"||"+filters.ed+"||"+cat_filters.digits

И если это не последний параметр то добавляем ещё в конце ";"

Итог выполнения для одного товара
Код

Установка=каминная|пристенная||||0;Режим работы=отвод / циркуляция||||0;Тип каминной вытяжки=каминная|пристенная||||1;
Тип встраивания=каминная|пристенная||||2;Тип управления=механическое|ползунковое||||0;
Элементы управления=механическое|ползунковое||||1;Тип освещения=лампа накаливания||||0;
Количество ламп освещения=2|25 ||||0;Мощность каждой лампы|Вт=2|25 ||||1;Цвет=серебристый||||0;
Немаркая поверхность=серебристый||||1;Ширина|см=900||мм||-10


Я попытался сам составить просто SELECT формирующий эту строку, чтобы потом каким-нибудь JOIN-ом присоединить. И у меня получился вот такой
Код

SELECT

group_concat(distinct
 concat(c.name, '=', ifnull(gf1.int_value, IFNULL(gf2.int_value, IFNULL(fv1.ym, IFNULL(fv2.ym, IFNULL(fv1.txt_value, fv2.txt_value))))),'||' , f.ed, '||', c.digits)
                           order by c.srt separator ';' ) mparams

 FROM cat_filters c

LEFT JOIN goods_filters gf1 ON c.flt_id = gf1 .flt_id  AND gf1.good_id=3074
LEFT JOIN goods_filters gf2 ON c.flt_id = gf2  .flt_id  AND gf2 .good_id=2074

LEFT JOIN filters_values fv1 ON gf1.value = fv1.id 
LEFT JOIN filters_values fv2 ON gf2.value = fv2.id 
LEFT JOIN filters f ON c.flt_id = f.id 
 WHERE c.mflt = 2 AND  c.type =7 AND c.srt>-1
GROUP BY c.mflt ORDER BY `c`.`srt` ASC

Но результат получался вот такой. Те фильтры которые есть у двоих good_id они дублируются
Код

Установка=||||0;Установка=каминная|пристенная||||0;Режим работы=отвод / циркуляция||||0;Тип каминной вытяжки=||||1;
Тип каминной вытяжки=каминная|пристенная||||1;Тип встраивания=||||2;Тип встраивания=каминная|пристенная||||2;
Производительность|куб.м/ч=1260||м<sup>3</sup>/ч||0;Количество скоростей=4||||0;Тип управления=электронное|||||0;
Элементы управления=электронное|||||1;Тип освещения=галогенная лампа||||0;Количество ламп освещения=2|40 ||||0;
Мощность каждой лампы|Вт=2|40 ||||1;Таймер=есть||||0;Цвет=серебристый||||0;Немаркая поверхность=серебристый||||1;
Ширина|см=900||мм||-10;Глубина/см=900||мм||-10


Надобность в двух good_id поясняется довольно просто, 1 из них это Товар, а 2-ой это родитель.

Т.е. по факту мне необходимо формирование этой строки вставить в тот большой запрос, чтобы возвращалось всё одновременно.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Составление SQL-запросов | Следующая тема »


 




[ Время генерации скрипта: 0.0381 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.