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 вопроса:
- Можно ли сделать выборку одним запросом? Как мы видим отличия в условиях chars.bind_all = 1 (выбираются общие характеристики) и bind.cat_id={$cat_id} (выбираются частные характеристики).
- Этот запрос (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 чтобы потом не обрабатывать не нужные значения?