我有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
答案 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
感谢您的帮助和时间