MySQL: запросить таблицу «один ко многим»? - PullRequest
1 голос
/ 01 декабря 2010

Каким будет правильный способ запроса продуктов с определенным свойством в следующем дизайне базы данных с подходом «один ко многим»?

Полагаю, мне следует сделать что-то вроде следующего: SELECT (*) FROM productProperties WHERE property = 'weight' AND value = '10'

Но что, если мне нужны продукты, которые имеют одинаковый вес = 10 и цвет = синий в одном запросе? Пример дизайна базы данных:

таблица: продукты

------------------------
id    | name     |  price
------------------------
0     | myName   |  100
1     | myName2  |  200

таблица: productProperties

------------------------------------------------
product  | property     |  Value
------------------------------------------------
0        | weight       |  10
1        | weight       |  20
1        | color        |  blue

Ответы [ 2 ]

3 голосов
/ 01 декабря 2010

Что, если мне нужны продукты, которые имеют одинаковый вес = 10 и цвет = синий в одном запросе?

Одна опция:

select product, name
  from products inner join productProperties
    on (products.id = productProperties.product)
 where (property = 'weight' and value = '10')
    or (property = 'color' and value = 'blue')
 group by product, name
having count(1) = 2

Другая опцияс подзапросами:

select id, name
  from products p
 where exists (
         select 1
           from productProperties pp1
          where p.id = pp1.product 
            and pp1.property = 'weight'
            and value = '10'
       )
   and exists (
         select 1
           from productProperties pp2
          where p.id = pp2.product 
            and pp2.property = 'color'
            and value = 'blue'
       )
0 голосов
/ 01 декабря 2010
SELECT * FROM productProperties p 
WHERE (SELECT COUNT(*) FROM productProperties p1 WHERE p1.product = p.product AND 
( (property = 'weight' AND value = '10') OR (property = 'color' AND value = 'blue') ) 
 =2
...