【发布时间】:2010-03-10 18:03:38
【问题描述】:
更新:在玩了几个小时后,使用多查询解决方案并使用仅包含父属性的表来确定哪些项目需要更新。
抱歉标题不好,我想不出如何简洁地描述这个问题。
我有一组应该与属性具有一对一关系的项目。
我有一个查询来返回那些数据错误并且这种关系已被破坏(一对多)的行。我正在收集这些行来修复它们并恢复这种一对一的关系。
这是对我的实际问题的理论上的简化,但我会按照要求在此处发布示例表架构。
item表:
+------------+------------+-----------+
| item_id | name | attr_id |
+------------+------------+-----------+
| 1 | BMW 320d | 20 |
| 1 | BMW 320d | 21 |
| 2 | BMW 335i | 23 |
| 2 | BMW 335i | 34 |
+------------+------------+-----------+
attribute表:
+---------+-----------------+------------+
| attr_id | value | parent_id |
+---------+-----------------+------------+
| 20 | SE | 21 |
| 21 | M Sport | 0 |
| 23 | AC | 24 |
| 24 | Climate control | 0 |
....
| 34 | Leather seats | 0 |
+---------+-----------------+------------+
返回具有多个属性的项目的简单查询。
SELECT item_id, COUNT(DISTINCT(attr_id)) AS attributes
FROM item GROUP BY item_id HAVING attributes > 1
这让我得到这样的结果集:
+-----------+------------+
| item_id | attributes |
+-----------+------------+
| 1 | 2 |
| 2 | 2 |
| 3 | 2 |
-- etc. --
但是,有一个例外。 attribute 表可以通过表中的父链接保存树结构。对于某些行,parent_id 可以保存另一个属性的 ID。这棵树只有一层。示例:
+---------+-----------------+------------+
| attr_id | value | parent_id |
+---------+-----------------+------------+
| 20 | SE | 21 |
| 21 | M Sport | 0 |
....
我不想在我的原始查询中检索项目,其中,对于一对关联的属性,它们的相关性类似于属性 20 和 21。
我确实想要检索以下项目:
- 属性没有父属性
- 对于两个或多个不相关的属性(例如属性 23 和 34)
所需的示例结果,只是项目 ID:
+------------+
| item_id |
+------------+
| 2 |
+------------+
如何从items 加入attributes 并排除这些行?
我是使用临时表还是可以通过单个查询来实现这一点?
谢谢。
【问题讨论】:
-
您能否为“项目”添加示例数据和结构,以及它在所有 3 个场景中与“属性”的关系:干净数据(1 对 1)、脏数据(1 对很多),还有例外情况?
-
这些都是对实际系统的理论上的简化。回家后我会添加一些示例。
-
这棵树只有 1 级,还是 n?如果 n,我认为您需要一个递归解决方案 - 这使得它更难。
-
你能把要求的结果和你放另一张桌子一样吗?
-
是的,树只有 1 级。我添加了一个示例所需的结果集。问题已更新。