SQL-запрос многие ко многим (четыре таблицы) - PullRequest
1 голос
/ 13 декабря 2011

Столы

товар : id, цена productattribute : id, productid, attributeid атрибуты : идентификатор, значение, идентификатор атрибута типа attributetype : идентификатор, имя

Запрос

select p.Name, p.Price, att.Id, att.Value, at.Id, at.Name
from Product p
inner join ProductAttribute pa on pa.ProductId = p.Id
inner join Attributes att on att.Id = pa.AttributeId
inner join AttributeType at on att.AttributeTypeId = at.Id

Результат

Name              Price    Id    Value     Id      Name
Slr camera           90     1    White      1      Color   
digital camera       98     2    Black      1      Color    
Slr camera           90     4    big        2      Size
digital camera       98     5    medium     2      Size

Теперь я хочу получить продукты, отфильтровывая attributeid, т.е.тип атрибута цвета, а не размер.Я имею в виду, что теперь он должен получить три строки: строки с цветом - белый, размер - большой и размер - средний.

Ответы [ 3 ]

2 голосов
/ 13 декабря 2011

Используйте предложение where, чтобы разрешить нецветные атрибуты и цветовые атрибуты, если они белые:

where  at.AttributeTypeId <> 1 -- Non-color attribute
       or at.AttributeTypeId = 1 and att.Id = 1 -- White color
0 голосов
/ 13 декабря 2011

Может быть, запрос ниже будет полезен для вас:

SELECT
  p.Name,
  p.Price,
  att.Id,
  att.Value,
  at.Id,
  at.Name 
FROM
  Product p, ProductAttribute pa, Attributes att, AttributeType at
WHERE pa.ProductId=p.Id
  AND att.Id=pa.AttributeId 
  AND att.AttributeTypeId=at.Id
  AND (  at.Id <> 1
      OR at.Id = 1 AND att.value = 'White')
0 голосов
/ 13 декабря 2011
select p.Name,p.Price,att.Id,att.Value,at.Id,at.Name from Product p
inner join ProductAttribute pa on pa.ProductId=p.Id
inner join Attributes att on att.Id=pa.AttributeId
inner join AttributeType at on att.AttributeTypeId=at.Id
where att.id = 1 or (at.AttributeTypeId = 1 and att.Id = 1 );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...