【问题标题】:Select values from table with multiple attributes从具有多个属性的表中选择值
【发布时间】:2013-12-30 19:18:32
【问题描述】:

我有 3 张桌子: 1:产品(ID,名称) 2:product_attributes(attribute_id,名称) 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

【问题讨论】:

  • 如果失败,请分享您遇到的错误,如果有的话。如果它失败是因为您没有得到预期的结果,那么您需要共享您输入查询的数据和预期的结果。请尽可能对问题进行描述/透明,这将有助于社区更快、更详细地为您提供帮助。
  • 它返回空查询,但是当我在 phpmyadmin 中检查时,至少有 3 个产品匹配此选择
  • 正如 T McKeown 在下面的回答中所建议的那样,您的查询中的 and 语句的分组可能存在问题。如果他的回答对你有用,那就太好了;否则,您将需要分享您的数据和预期结果,以便其他人找出问题所在。

标签: mysql


【解决方案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

【讨论】:

  • 您使用了 OR,因此它显示 p.id 具有两个属性之一,但我必须仅选择具有完全所需属性的 thouse 产品这是带有属性数据的 XML:kielkowski-szkolka.pl/attributs_data.xml
  • 我行只有1个atrybut,但1个产品可以有多个属性。我只想过滤某些属性的产品,就像在其他商店一样:)
  • 我“认为”您在问如何将您的 xml 数据作为选择的 where 标准?您的问题不清楚您到底想要达到什么目标。
  • 好吧抱歉混乱。我将尝试再描述一次。
  • 好吧抱歉混乱。我将尝试更好地描述这一点。表 produkty_atrybuty_wartosci 包含 product_id 和 attribute_id 及其值。一个产品可以有多个属性,但一个属性只包含 1 个值(对于 1 个产品)。现在我想使用一个或多个组合属性+值来过滤产品。例如,我只想显示“颜色”(属性)为“红色”(值),“尺寸”(属性)为“XXL”(值)的产品
【解决方案2】:

通过以下查询,您可以获得所有 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;

【讨论】:

    【解决方案3】:

    有一个 table1 resource 与列 {'id','name',....} 和 table2 resource_attribute 与列 {'id','resource_id','attribute_name','attribute_value'} 其中列 resource_id 是指向 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
    

    当然,如果您想让它动态化,并使用您需要的属性名称和值,您可以保存要在查询中使用的属性数量,并在最终的COUNT(*) 函数中重复使用。

    我在我的代码 (java) 中使用这个查询动态并且它可以工作。

    【讨论】:

      【解决方案4】:

      其实我找到了适合我的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
      

      感谢您的帮助和时间

      【讨论】:

        猜你喜欢
        • 2017-08-31
        • 2010-10-11
        • 1970-01-01
        • 2015-04-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-03
        • 2021-03-29
        相关资源
        最近更新 更多