SQL оптимизация запроса. Один запрос вместо 2-х через UNIOUN

Есть запрос который выбирает характеристики товаров для фильтра товаров. Вот сам запрос:

SELECT  chars.id as id,
                            chars.published as published,
                            chars.title as title,
                            chars.fieldtype as fieldtype,
                            chars.fieldgroup as fieldgroup,
                            chars.is_compare as is_compare,
                            chars.is_filter as is_filter,
                            chars.is_filter_many as is_filter_many,
                            chars.`values` as `values`,
                            chars.bind_all as bind_all,
                            chars.units as units,
                            chars.usergroup as usergroup,
                            bind.ordering as ordering, 
                            (SELECT GROUP_CONCAT(DISTINCT val SEPARATOR '; ') FROM cms_shop_chars_val WHERE char_id = chars.id  AND val <> '' {$catids} ORDER BY val ASC ) as inpvals

                      FROM  cms_shop_chars chars, cms_shop_chars_bind bind 

                     WHERE  bind.cat_id={$cat_id} AND
                            bind.char_id = chars.id and 
                            chars.is_filter = 1
                            
                    UNION
                        SELECT  chars.id as id,
                                chars.published as published,
                                chars.title as title,
                                chars.fieldtype as fieldtype,
                                chars.fieldgroup as fieldgroup,
                                chars.is_compare as is_compare,
                                chars.is_filter as is_filter,
                                chars.is_filter_many as is_filter_many,
                                chars.`values` as `values`,
                                chars.bind_all as bind_all,
                                chars.units as units,
                                chars.ordering as ordering,
                                chars.usergroup as usergroup,
                               (SELECT GROUP_CONCAT(DISTINCT val SEPARATOR '; ') FROM cms_shop_chars_val WHERE char_id = chars.id  AND val <> '' {$catids} ORDER BY val ASC ) as inpvals

                        FROM  cms_shop_chars chars

                        WHERE  chars.bind_all = 1 and 
                                chars.is_filter = 1

                    ORDER BY ordering ASC

Объединено 2 запроса. Первым запросом выбираются все характеристики товаров для заданной категории, вторым выбираются характеристики, которые назначены всем категориям. Есть 2 вопроса:

  1. Можно ли сделать выборку одним запросом? Как мы видим отличия в условиях chars.bind_all = 1 (выбираются общие характеристики) и bind.cat_id={$cat_id} (выбираются частные характеристики).
  2. Этот запрос (SELECT GROUP_CONCAT(DISTINCT val SEPARATOR '; ') FROM cms_shop_chars_val WHERE char_id = chars.id AND val <> '' {$catids} ORDER BY val ASC ) as inpvals в редких случаях возвращает NULL. Это связано с тем, что может быть ситуация когда всем товарам которые перечислены в {$catids} не не назначены значения характеристики. Тогда в фильтре товаров отображается название характеристики и пустое значение как видно на рисунке: Скрин фильтра товаров с пустым значением Можно ли в самом запросе сделать контроль на NULL чтобы потом не обрабатывать не нужные значения?

Ответы (0 шт):