2014-12-19 2 views
0

я следующая таблицу, product_taxonomy_id:Найти строки из результатов одного запроса, которые удовлетворяют другое требование

| product_id | taxonomy_id | value_id | 
+------------+-------------+----------+ 
|  1  |  2  |  4 | 
|  1  |  1  |  1 | 
|  2  |  1  |  1 | 
|  2  |  3  |  8 | 
|  3  |  2  |  5 | 
|  3  |  1  |  2 | 
|  4  |  1  |  1 | 
|  4  |  2  |  4 | 
|  4  |  3  |  8 | 

Я хочу, чтобы получить product_ids, которые имеют таксономию = 1 и value_id = 1 И таксономии = 2 и value_id = 4.

продукты, которые отвечают первому требованию, являются: 1, 2, 4.

Из тех, требования, которые удовлетворяют второму требованию: 1, 4

Я могу сделать это с помощью следующего запроса:

SELECT DISTINCT `product_id` FROM product_taxonomy_value 
INNER JOIN (SELECT DISTINCT `product_id` FROM product_taxonomy_value WHERE `taxonomy_id` = 1 AND `value_id` = 1) a USING (`product_id`) 
INNER JOIN (SELECT DISTINCT `product_id` FROM product_taxonomy_value WHERE `taxonomy_id` = 2 AND `value_id` = 4) b USING (`product_id`) 

Есть ли лучшее решение?

ответ

1

Я думаю, вы должны использовать подзапросы для этого. Сначала разбейте это на куски и верните их вместе.

Вы хотите получить product_ids, которые имеют taxonomy_id от 1 и value_id из 1. Вы можете сделать это с помощью простого WHERE пункта:

SELECT DISTINCT product_id 
FROM product_taxonomy_value 
WHERE taxonomy_id = 1 AND value_id = 1; 

Теперь вы хотите, чтобы получить результаты от того, что отвечают другим требованиям. Что я хотел бы сделать, это написать второй запрос, который получает идентификаторы, которые удовлетворяют второе условие:

SELECT DISTINCT product_id 
FROM product_taxonomy_value 
WHERE taxonomy_id = 2 AND value_id = 4; 

И вы можете добавить требование подзапроса, который обеспечивает идентификаторы вернулись из второго запроса также возвращенный первыми, как это:

SELECT DISTINCT product_id 
FROM product_taxonomy_value 
WHERE taxonomy_id = 2 AND value_id = 4 AND product_id IN(
    SELECT DISTINCT product_id 
    FROM product_taxonomy_value 
    WHERE taxonomy_id = 1 AND taxonomy_id = 1); 

Я побежал это в SQL Fiddle, и это было намного быстрее, чем первый, но оба вернулись те же самые результаты.

+0

Спасибо @ McAdam331 за редактирование названия и устранение путаницы из вопроса. – tronmcp

+1

Спасибо за ответы! – Josep

+0

@Josep рад помочь. Если вы использовали какой-либо ответ для решения своей проблемы, пожалуйста, подтвердите его и примите его, нажав стрелку вверх и галочку рядом с ответом, который вам помог. – AdamMc331

1

Да, вы можете использовать этот запрос:

SELECT DISTINCT product_id 
    FROM product_taxonomy_value 
    WHERE taxonomy_id IN (1, 2) 
     AND value_id IN (1, 4); 

EDIT: If tronmcp прямо о предмете, то вы можете использовать этот запрос:

SELECT DISTINCT product_id 
    FROM product_taxonomy_value 
    WHERE product_id IN (SELECT product_id FROM product_taxonomy_value WHERE taxonomy_id = 1 AND value_id = 1) 
     AND taxonomy_id = 2 
     AND value_id = 4; 
+1

Проблема с этим запросом заключается в том, что если у вас есть четвертый продукт с таксономией = 1 и value_id = 4, он также будет отображаться на результат, и это не должно происходить, поскольку комбинации должны быть: продукты, которые имеют таксономию = 1 и value_id = 1: 1, 2, 4 и теперь для этих продуктов продукты, которые имеют таксономию = 2 и value_id = 4, равны (1,4), поэтому комбинация 1 и 4 соответственно недопустима. – tronmcp

+0

Хорошее редактирование, я хотел бы добавить, что @tronmcp прав, а ваш второй запрос дает те же результаты, что и исходный запрос OP. Вот [Fiddle] (http://sqlfiddle.com/#!2/3f35a4/6). – AdamMc331

+0

Благодарим вас за ответы! – Josep

0

Если я понял ваш правильный ответ должен дать правильный ответ

SELECT DISTINCT product_id 
FROM product_taxonomy_value 
WHERE 
    (taxonomy_id = 1 AND value_id = 1) 
    OR (taxonomy_id = 2 AND value_id = 4); 
+0

Это не сработает, потому что оно также вернет product_id 2, но product_id 2 не отвечает обоим требованиям. – AdamMc331

+0

правильный, это не сработает, но спасибо за ваш ответ – Josep

Смежные вопросы