#mysql #attributes
#mysql #атрибуты
Вопрос:
У меня есть система атрибутов, в которой я могу применять пользовательские поля к продуктам, таким как марка, размер и т.д… Во интерфейсной части сайта вы увидите список продуктов и список атрибутов для фильтрации, а также количество ожидаемых товаров:
- Марка A (12)
- Марка B (8)
- …
Размер:
- размер a (9)
- размер b (11)
После фильтра я хочу обновить список атрибутов, а также включить те записи, которые не имеют «совпадений». С моим текущим запросом я получаю только те записи, которые имеют обращения.
Короче говоря: как мне получить атрибуты 0 элементов?
У меня есть этот запрос (пример с выбранным фильтром одного атрибута)
SELECT
attr.id, attr.title
, attrval.value, attrval.id as valid
, COUNT(attrlink.id) AS attrcount
FROM #__foc_users_attributes AS attr
LEFT JOIN #__foc_users_attr_val AS attrval
ON attrval.attrid = attr.id AND attrval.value !=''
LEFT JOIN #__foc_users_attr_link AS attrlink
ON (attrlink.valueid = attrval.id)
LEFT JOIN #__foc_users_items AS item
ON (item.id = attrlink.itemid)
INNER JOIN #__foc_users_attr_link AS attrlink1
ON attrlink1.itemid = item.id
AND ((attrlink1.attrid=1 AND attrlink1.valueid=33))
WHERE item.published=1 AND attr.published = 1 AND attrval.value != ''
GROUP BY attrval.id
Комментарии:
1. Возможно, схема таблицы может помочь. Решением может быть запись #__foc_users_items в качестве первой таблицы и выполнение левых соединений для всех остальных, почему #__foc_users_attr_link имеет внутреннее соединение, а не левое соединение?
2. Вы правы; Я использовал левое соединение для каждой отдельной группы атрибутов, и теперь оно работает! Спасибо за ответ.
Ответ №1:
SELECT
attr.id, attr.title
, attrval.value, attrval.id as valid
, COUNT(attrlink.id) AS attrcount
FROM #__foc_users_attributes AS attr
LEFT JOIN #__foc_users_attr_val AS attrval
ON attrval.attrid = attr.id AND attrval.value !=''
LEFT JOIN #__foc_users_attr_link AS attrlink
ON (attrlink.valueid = attrval.id)
LEFT JOIN #__foc_users_items AS item
ON (item.id = attrlink.itemid)
LEFT JOIN #__foc_users_attr_link AS attrlink1 <<-- replace inner with LEFT join
ON attrlink1.itemid = item.id
AND ((attrlink1.attrid=1 AND attrlink1.valueid=33))
WHERE item.published=1 AND attr.published = 1 AND attrval.value != ''
GROUP BY attrval.id