Одностолбцовый множественный фильтр в Mysql пересечении - PullRequest
1 голос
/ 22 апреля 2010

Вот таблица

CarID| Attribute    | Value
1   | Color     | Red
2   | Color     | Blue 
3   | Color     | Red 
1   | Type      | Coupe 
2   | Type      | Hatch Back 
3   | Type      | Coupe
3   | Make      | Honda
2   | Make      | Toyota
1   | Make      | Ford

Теперь я хотел бы запустить фильтр Как Выбрать * Из автомобилей ГДЕ (Атрибут = Цвет И Значение = Красный) И (Атрибут = Сделать И Значение = Honda) .... и Надеюсь получить CarID как 3!

Это простой случай пересечения двух запросов, но я не знаю, как это сделать за один запрос.

Любая помощь оценена.

Ответы [ 3 ]

3 голосов
/ 22 апреля 2010
select
      carid,
      count(*) matchedItems
   from
      YourTable
   where
        ( Attribute = 'Color' and Value = 'Red' )
     OR ( Attribute = 'Make' and Value = 'Honda' )
   group by 
      carid 
   having
      matchedItems = 2;

вам, возможно, придется изменить необходимость на ...

 having count(*) = 2
1 голос
/ 22 апреля 2010

Наиболее простым решением было бы моделирование отдельной таблицы для каждого атрибута с подзапросами (хотя это может быть не самым эффективным):

SELECT Colors.CarID FROM
    ( SELECT CarID, Value FROM Cars WHERE Attribute = 'Color' ) Colors,
    ( SELECT CarID, Value FROM Cars WHERE Attribute = 'Make' ) Makes
    WHERE Colors.CarID = Makes.CarID AND Colors.Value = 'Red' AND
        Makes.Value = 'Honda';
0 голосов
/ 22 апреля 2010

Вот еще один вариант запроса

SELECT carid
FROM AnotherUnknownTableName t INNER JOIN  
     AnotherUnknownTableName t2 ON t.carid = t2.carid AND 
                                   t.Attribute = 'Color' AND 
                                   t2.Attribute = 'Make'
WHERE 
     t.Value = 'Red' AND t2.Value = 'Honda'

Наличие индекса (carid, Attribute) будет творить чудеса.

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