Запрос атрибутов; также включает атрибуты без совпадений во внутреннем соединении

#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