Mysql (доктрина) - считать внутреннее соединение, имеющее счет> X - PullRequest
0 голосов
/ 15 января 2019

У меня есть SQL для подсчета продуктов с определенными свойствами. Я использую его в фильтре товаров. SQL очень длинный, но вот основная часть:

SELECT COUNT(products.id) as products_count, property_items.description, property_items.id as id
FROM property_items
INNER JOIN product_properties ON property_items.id = product_properties.property_item_id
INNER JOIN products ON product_properties.product_id
INNER JOIN product_properties pp ON products.id = pp.product_id AND (pp.property_item_id IN ($ids))
GROUP BY property_items.id
HAVING COUNT(pp.id) >= $countIds

Это прекрасно работает, когда у меня есть только один элемент в $ids, но когда я выбираю еще один элемент, результат плохой. Похоже, что sql возвращает количество всех продуктов с любым свойством из $ids, но мне нужно учитывать только продукты, которые содержат все свойства.

Сначала получите все доступные свойства. К каждому свойству присоедините продукты, содержащие это свойство, и вернитесь ко всем свойствам этого продукта, чтобы проверить, содержит ли продукт уже проверенные свойства. Или это плохая идея? Мне нужно сохранить первичную таблицу (FROM table) как property_items.

Мне нужно получить результат в следующем формате:

=============================
id|description|products_count
=============================
1 |lorem ipsum|10
-----------------------------
2 |dolore sit |2

Спасибо за любую идею.

Ответы [ 2 ]

0 голосов
/ 15 января 2019

Вы можете получить идентификаторы продукта, которые имеют все свойства, выполнив:

SELECT pp.property_id
FROM property_items pi INNER JOIN
     product_properties pp
     ON pi.id = pp.property_item_id INNER JOIN
     products p
     ON pp.product_id = p.id
WHERE pp.property_item_id IN ($ids)
GROUP BY pp.property_id
HAVING COUNT(DISTINCT pp.property_item_id) = $countIds  -- has all of them

Обратите внимание, что я рационализировал соединения. Я думаю, что ваше упрощение запроса было не совсем правильным. Я также добавил псевдонимы таблиц, чтобы легче было писать и читать запрос.

Если вы хотите подсчитать количество таких продуктов, используйте подзапрос:

SELECT COUNT(*)
FROM (SELECT pp.property_id
      FROM property_items pi INNER JOIN
           product_properties pp
           ON pi.id = pp.property_item_id INNER JOIN
           products p
           ON pp.product_id = p.id
      WHERE find_in_set(pp.property_item_id, $ids)
      GROUP BY pp.property_id
      HAVING COUNT(DISTINCT pp.property_item_id) = $countIds  -- has all of them
     ) ;

Ваша проблема, вероятно, из-за этой строки:

      WHERE pp.property_item_id IN ($ids)

Если вы передаете $ids в виде строки через запятую, ваш запрос не будет работать. Обратите внимание на замену выше.

0 голосов
/ 15 января 2019

Попробуйте использовать SELECT COUNT (DISTINCT products.id) как cnt

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...