2016-12-08 4 views
1

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

У меня есть таблица с кодом «код продукта» с тремя столбцами, продукт можно повторить, но код должен быть уникальным для каждого продукта. Это структура таблицы:

CREATE TABLE table1 
    (`id` int, `product` varchar(10), `code` int) 
; 

INSERT INTO table1 
    (`id`, `product`, `code`) 
VALUES 
    (1, 'product1', 1), 
    (2, 'product1', 2), 
    (3, 'product1', 3), 
    (4, 'product2', 2), 
    (5, 'product2', 3), 
    (6, 'product3', 1), 
    (7, 'product3', 3) 
; 

Так что я пытаюсь сделать, это список дел, если продукт имеет код 1 и код 2, показывает определенное значение в колонке ответа, если продукт имеет только код 1, показывает другое значение, если у продукта есть код 2, то другое значение, и если у продукта нет кода 1 или кода 2, тогда показывается другое значение (код 3 в данном примере не имеет значения).

Это то, что я так далеко

select product, 
    case 
    when exists(select 1 from table1 where code=1) = 1 
     and exists(select 1 from table1 where code=2) = 1 
    then 'Types are : 1,2' 
    when exists(select 1 from table1 where code=1) = 1 
     and exists(select 1 from table1 where code=2) = 0 
    then 'Type is : 1' 
    when exists(select 1 from table1 where code=1) = 0 
     and exists(select 1 from table1 where code=2) = 1 
    then 'Type is : 2' 
    else 
     'There are no types 1 or 2' 
    end as response 
from table1 
group by product 

Проблема заключается в том, что Resultset показывает только «типы: 1,2» в моей колонке ответа на Product1, product2 и product3, я считаю, что в подвыборки ищет все продукты (а не для каждого продукта), поэтому всегда верно, что существуют код 1 и код 2.

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

Спасибо за чтение.

Fiddle пример: http://sqlfiddle.com/#!9/25eb55/3

ответ

3

Ваших подзапросов поиск всей таблицы для кода интересующими вас, а не только строк с тем же продуктом.

Необходимо использовать коррелированный подзапрос , если вы хотите, чтобы подзапрос оценивался только по строкам с одним и тем же продуктом.

select p.product, 
    case 
    when exists(select 1 from table1 where code=1 and product=p.product) = 1 
     and exists(select 1 from table1 where code=2 and product=p.product) = 1 
    then 'Types are : 1,2' 
    when exists(select 1 from table1 where code=1 and product=p.product) = 1 
     and exists(select 1 from table1 where code=2 and product=p.product) = 0 
    then 'Type is : 1' 
    when exists(select 1 from table1 where code=1 and product=p.product) = 0 
     and exists(select 1 from table1 where code=2 and product=p.product) = 1 
    then 'Type is : 2' 
    else 
     'There are no types 1 or 2' 
    end as response 
from table1 as p 
group by product 

Выход:

+----------+------------------+ 
| product | response   | 
+----------+------------------+ 
| product1 | Types are : 1,2 | 
| product2 | Type is : 2  | 
| product3 | Type is : 1  | 
+----------+------------------+ 

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

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

SELECT product, 
    CASE GROUP_CONCAT(CASE WHEN code IN (1,2) THEN code ELSE NULL END ORDER BY code) 
    WHEN '1' THEN 'Type is : 1' 
    WHEN '1,2' THEN 'Types are: 1,2' 
    WHEN '2' THEN 'Type is : 2' 
    ELSE 'There are no types 1 or 2' 
    END AS response 
FROM table1 
GROUP BY product 
+1

Определенно путь быстрее, я беспокоился о производительности, но не больше. – None

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

  • Нет связанных вопросов^_^