Альтернатива предложению WHERE IN для фильтров продуктов

#mysql #sql

#mysql #sql

Вопрос:

Я ищу альтернативный SQL-запрос к следующему оператору:

 SELECT COUNT(`id`) FROM `products`
    WHERE 
      `category` = "Motors" AND 
      `id` IN(SELECT `id` FROM `products` WHERE 
                `Horsepower` > 200 AND 
                `id` IN(SELECT `id` FROM `products` WHERE 
                          `Manufacturer` = "Baldor"))
  

Как вы можете видеть, теоретически (поскольку я специально не тестировал это) все вложенные запросы выбирают идентификаторы продуктов. Затем из окончательного списка идентификаторов продуктов генерируется КОЛИЧЕСТВО. Этот метод может замедляться, когда существует много вложенных запросов.

Я работаю над системой фильтрации. Таким образом, выбирается один или несколько фильтров и подфильтров, и на основе текущего выбора генерируется КОЛИЧЕСТВО.

Было бы замечательно, если бы я мог создать инструкцию SQL для возврата количества продуктов на основе любого количества вложенных фильтров (без создания предложений «WHERE IN»).

Приведенный выше запрос можно просто настроить на использование только WHERE…Предложение AND. Проблема заключается в использовании чего-то подобного следующему в качестве подзапросов, поскольку для этого необходимо выбрать несколько условий:

 SELECT `products`.`id` FROM `products` 
  LEFT JOIN `attributes` ON `attributes`.`product_id` = `products`.`id`
  WHERE `attributes`.`Label` = "Horsepower" AND
        `attributes`.`Value` > 200
SELECT `products`.`id` FROM `products` 
  LEFT JOIN `attributes` ON `attributes`.`product_id` = `products`.`id`
  WHERE `attributes`.`Label` = "Category" AND
        `attributes`.`Value` = "Motors"
  

Комментарии:

1. Кажется довольно бессмысленным. почему не просто один where category=motors and horsepower > 200 and manufacturer = balor ?

2. Для чего вам нужны подзапросы? Вы не можете просто написать одно предложение where?

3. Вы можете буквально просто удалить строки 4 и 6, а также 2 завершающих ) строки.

Ответ №1:

Зачем вам нужен in? Просто И требования вместе

 select count(`id`) from `products` where category = "Motors" and `HorsePower` > 200 and `Manufacturer` = "Baldor"
  

Обычный метод для выполнения этого в коде, предполагающий, что вы не используете ORM (что, честно говоря, учитывая, что вы задаете вопрос, который, вероятно, должен быть), был бы примерно таким

 #Python
conds = ['category = "Motors"', '`Horsepower` > 200']
query = 'SELECT COUNT(`id`) FROM `products` WHERE '   ' and '.join(conds)
  

Если вам нужно извлечь данные из второй таблицы, вы можете сделать что-то вроде:

 select count(products.id) from products left join extra on extra.product_id = products.id where products.category = 'foo' and extra.fielda = 'blah' and extra.fieldb = 'bar'
  

Вы можете использовать дополнительные объединения, если вам нужно несколько таблиц.

Комментарии:

1. Это так просто, когда имеешь дело с показанным предложением WHERE. Теперь я вижу, в чем заключается сложность. Это заключается в каждом подзапросе, выбирающем условия из других таблиц. Таким образом, он может выбрать метку и значение в качестве единого условия. Это почти так, как если бы сначала нужно было выбрать продукты, прежде чем переходить к следующему фильтру.

2. @CodyHelscel . . . Этот вопрос довольно четко касается извлечения из одной таблицы. Если у вас есть расширенный вопрос о извлечении данных из нескольких таблиц, я бы посоветовал вам принять этот ответ и написать другой вопрос с примерами данных и желаемыми результатами.