我有一个属性表,其中包含:
parent_record_id
(属性所属的记录),
property_type_id
(属性的名称是什么)和
property_value
该属性。
现在我有一个名为 DATE
的 property_type
和另一个名为 PRICE
的 property_type
。当我想搜索带有
价格 = 50 美元或日期 = 2016-10-02
它按预期执行。然而,客户端需要能够检索具有 PRICE = 50$
且已在 DATE = 2016-10-02
售出的记录。所以本质上,如果他们的两个 child 遇到任何一个,我必须得到记录
(property_type = PRICE AND property_value = 50$)或(property_type = DATE AND property_value = 2016-10-02)
我想最简单的方法是在 SQL 中执行该查询,然后对记录进行 GROUP
并检查属性的 SUM
= 2
。 (0)
我还发现,在穿越网络空间时,另一种杀死众所周知的巨龙的方法是两次加入属性表(在这个例子的上下文中)每次分配不同的别名,然后对这些别名执行两个查询表。 (1) 结果令我非常满意。
(0) 解决方案似乎很浪费,因为它会继续检查行是否满足条件,即使其中一个已被证明是错误的(并且由于每条记录可能有多达 20 个这样的属性/值对,因此表是会很大)。
更新:现在我已经考虑得更多了 (1) 可能会有同样的缺点并且还会检查同一行两次。
(1) 呢?有没有其他的可能性来解决这个问题。相比之下,这两种解决方案的性能如何?
(是的,我知道以这种方式对属性进行建模,尤其是在表上,无论如何都会在未来令人头疼,但 RDBMS 是我必须使用的,并且考虑到当前情况,这个解决方案似乎很灵活)
最佳答案
还有一些其他可能性(例如 WHERE 子句中的子查询),但我认为您提供的 (0) 是最优雅和语义正确的。
至于性能,您可以在需要时尝试调整它,而不是之前,因为“过早的优化是万恶之源”。 ;)
关于mysql - 如果子行匹配多个条件,SQL 获取父行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39661047/