从具有多个属性的表中选择值

时间:2013-12-30 19:18:33

标签: mysql

我有3张桌子: 1:产品(id,名称) 2:product_attributes(attribute_id,name) 3:product_attributes_selected(product_id,attribute_id,value)

现在我希望获得具有两个或更多所需属性和值的所有product_id 我怎么能做到这一点?

我试过了,但失败了:

select p.id,p.nazwa_pl 
from produkty p,produkty_atrybuty_wartosci paw 
where (paw.atrybut_id=2 and paw.wartosc=4) 
  and (paw.atrybut_id=3 and paw.wartosc=0) 
  and p.id=paw.produkt_id 
group by p.id

4 个答案:

答案 0 :(得分:1)

在我的例子中,我们有一个名为Attribs的表,一些你需要创建的表(例如TABLE变量,或CTE或其他方式),我的代码将告诉你如何加入它。

CREATE TABLE Attribs( Attrib INT,  Val INT )

^^在其中填充一些数据......(再次可以自动化)^^

select p.id,p.nazwa_pl 
from produkty p
JOIN produkty_atrybuty_wartosci paw 
  ON  p.id=paw.produkt_id 
JOIN Attribs AS A
  ON A.Attrib = paw.atrybut_id
 AND A.Val = paw.wartosc

答案 1 :(得分:1)

使用以下查询,您将获得所有ID。您的想法如下:您将获得具有属性2 OR 3 OR 4的所有产品。然后,您将结果按产品ID分组并计算分组的项目(grouped)。只有那些组合3个条目的条目(您正在搜索3个属性ID)就足够了。显然,生成的产品可以有更多属性,但是您要求至少提供的属性。

SELECT p.id, p.nazwa_pl, paw.bibkey, paw.keywordid, COUNT(*) as grouped
FROM produkty p, produkty_atrybuty_wartosci paw
WHERE p.id=paw.produkt_id AND paw.atrybut_id IN (2, 3, 4) GROUP BY p.id
HAVING grouped = 3;

答案 2 :(得分:1)

具有一个带有列resource的table1 {'id','name',....}和一个带有列resource_attribute的table2 {'id','resource_id','attribute_name','attribute_value'},其中列resource_id是指向{{1}的外键},您可以通过以下方式实现:

Resource.id

当然,如果要使其动态并使用所需的属性名称和值,则可以保存要在查询中使用的属性数量,并在最终的SELECT r.* FROM resource r LEFT JOIN resource_attribute ra ON r.id = ra.resource_id AND ( (ra.NAME = 'height' AND ra.VALUE = '20') #First attribute OR (ra.NAME = 'color' AND ra.VALUE = 'blue') #Second attribute ) GROUP BY r.id HAVING COUNT(*) = 2 #Total number of attributes searched 函数中重复使用它。

我在代码(java)中动态使用此查询,并且有效。

答案 3 :(得分:0)

Actualy我发现ansfer对我有用

SELECT p.id,p.nazwa_pl FROM produkty p JOIN produkty_atrybuty_wartosci paw ON p.id=paw.produkt_id  WHERE (paw.atrybut_id,paw.wartosc) IN ((2,4),(3,0)) GROUP BY p.id, p.nazwa_pl HAVING COUNT(DISTINCT paw.atrybut_id)=2

感谢您的帮助和时间