Здравствуйте. Вообще проблема в целом вот такая.
Есть у меня вот такой запрос.
| Код |
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
|
Результат выполнения

Теперь дальше из таблицы
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

Но в этой ситуации мне необходима только строка 3074
Теперь уже из таблицы filters_values нужно получить значение по столбцу value.
Получаем вот такое.

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

И в итоге для всех строк которые есть в 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-ой это родитель.
Т.е. по факту мне необходимо формирование этой строки вставить в тот большой запрос, чтобы возвращалось всё одновременно.