2016-07-24 2 views
0

У меня есть таблица, содержащая множество разных записей для спецификаций продуктов, продукты могут отображаться несколько раз в таблице, так как они имеют разные цвета. Чтобы отображать продукты на экране, мне нужно выбрать их список с цветом ЖЕЛТЫЙ, но если ЖЕЛТЫЙ нет, мне нужен цвет BLUE, иначе я не хочу этого продукта.Выберите конкретную запись в группе записей для всех групп записей в MySQL

Упрощенные Продукты пример:

 
+----+--------+ 
| ID | NAME | 
+----+--------+ 
| 1 | Prod A | 
| 2 | Prod B | 
| 3 | Prod C | 
| 4 | Prod D | 
+----+--------+ 

Simplied Spec таблица:

 
+----+------------+--------+ 
| ID | ID_PRODUCT | COLOR | 
+----+------------+--------+ 
| 1 |   1 | BLUE | 
| 2 |   1 | YELLOW | 
| 3 |   2 | RED | 
| 4 |   2 | PINK | 
| 5 |   3 | BLUE | 
| 6 |   3 | GRAY | 
| 7 |   4 | YELLOW | 
+----+------------+--------+ 

Ожидаемые результаты:

 
+----+------------+--------+ 
| ID | ID_PRODUCT | COLOR | 
+----+------------+--------+ 
| 2 |   1 | YELLOW | 
| 5 |   3 | BLUE | 
| 7 |   4 | YELLOW | 
+----+------------+--------+ 

Сырье SQL для этого примера:

 
CREATE TABLE `colors` (
    `ID` int(11) NOT NULL, 
    `ID_PRODUCT` int(11) DEFAULT NULL, 
    `COLOR` varchar(16) DEFAULT NULL, 
    PRIMARY KEY (`ID`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

CREATE TABLE `products` (
    `ID` int(11) NOT NULL, 
    `NAME` varchar(16) DEFAULT NULL, 
    PRIMARY KEY (`ID`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

INSERT INTO `colors` VALUES (1,1,'BLUE'),(2,1,'YELLOW'),(3,2,'RED'),(4,2,'PINK'),(5,3,'BLUE'),(6,3,'GRAY'),(7,4,'YELLOW'); 

INSERT INTO `products` VALUES (1,'Prod A'),(2,'Prod B'),(3,'Prod C'),(4,'Prod D'); 

ответ

0

Вот один вариант использования conditional aggregation:

select id_product, 
     max(case when color = 'YELLOW' then id 
       when color = 'BLUE' then id 
      end), 
     max(case when color = 'YELLOW' then color 
       when color = 'BLUE' then color 
      end) 
from colors 
where color in ('YELLOW','BLUE') 
group by id_product 
+0

Мое плохое английское понимание помогло мне правильно понять вашу озабоченность по поводу ответа, который я принял. Действительно, в ответе Даршана Мехты идентификатор не всегда будет правильным. Ваш ответ более сложный, но правильный. –

0

Вот один метод:

select c.* 
from colors c 
where c.color = 'YELLOW' 
union all 
select c.* 
from colors c 
where c.color = 'BLUE' and 
     not exists (select 1 
        from colors c2 
        where c2.id_product = c.id_product and c2.color = 'YELLOW' 
       ); 
+0

Спасибо за это тоже, но он кажется слишком сложным из-за объединения и подвыборки. –

+0

@ AndréDias. , , С правильными индексами это, вероятно, самый быстрый способ получить нужные результаты. –

+0

Привет, пожалуйста, скажите мне, какие индексы (по возможности любительские). Мне нужно добавить, чтобы я мог сравнить оба решения. У меня более 80000 записей. –

0

Если он всегда будет синий и желтый сравнение, то я d просто используйте функцию max(), например

select id, id_product, max(color) from colors 
where color in ('BLUE','YELLOW') 
group by id_product; 
+0

Хотя это вернет правильный цвет, оно вернет произвольное значение для поля 'id'. 'mysql' позволяет это поведение, большинство других баз данных не ... – sgeddes

+0

Поскольку в этой теме mysql является единственной базой данных, которая имеет значение, я принял это как решение, поскольку это самый простой из всех вариантов. –

+0

Теперь я понимаю, что вы подразумеваете под «произвольным значением для id», это решение работает не так, как ожидалось. –

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