【发布时间】:2012-01-09 22:21:46
【问题描述】:
希望标题没有那么令人困惑 - 老实说,我不知道如何在一行中更好地解释我的问题 :-) (顺便说一句,谷歌它是正确的)
表“组”被构造为嵌套集以创建树形菜单。表“文章”中的文章引用此类组元素的 ID 以 - 很好 - 将它们分组:
Table 'article' Table 'group'
id | article | groupid id | title | left | right
1 | Bowl | 2 1 | material | 1 | 6
2 | Bowl | 5 2 | wood | 2 | 3
3 | Cube | 3 3 | steel | 4 | 5
4 | Cube | 6 4 | shape | 6 | 13
5 | Bowl | 10 5 | circle | 7 | 8
6 | Pyramid | 2 6 | square | 9 | 10
7 | Pyramid | 3 7 | rectangle| 11 | 12
8 | Pyramid | 11 8 | color | 14 | 21
9 | Bowl | 11 9 | red | 15 | 16
10 | Cube | 9 10 | green | 17 | 18
11 | Pyramid | 9 11 | blue | 19 | 20
要选择组元素的任意组合,我只需要一个查询,其中提到从 group.left 到 group.right 的范围,给我一组 group.id,我可以将其与 article.groupid 进行比较。 以下声明回应所有由木材组成的文章:
SELECT
a.article
FROM
article AS a
LEFT JOIN
group AS g
ON (
(
2 >= g.left
AND
3 <= g.right
AND
g.id = a.groupid
)
)
GROUP BY
a.article
现在我的问题是:我应该如何创建一个查询,例如响应所有由木头组成且有任何颜色的物品? 我希望在 WHERE 子句中重复连接子查询会达成交易:
SELECT
a.article
FROM
article AS a
WHERE
a.groupid IN
(
SELECT
CONCAT(g.id) AS gr
FROM
group AS g
WHERE
(
2 >= g.left
AND
3 <= g.right
)
)
AND
a.groupid IN
(
SELECT
CONCAT(g.id) AS gr
FROM
group AS g
WHERE
(
14 >= g.left
AND
21 <= g.right
)
)
此查询没有结果。顺便说一句,我不喜欢子查询,但是 JOINS 和 Sub-JOINS 的许多努力都没有奏效。 我的大脑在旋转——你们有什么建议吗?
谢谢
【问题讨论】:
-
为什么要指定
right和left值?你不能只加入group.id属性吗?有什么办法可以改变你的架构,因为它似乎在与你战斗而不是帮助你? -
不。没有文章提到“材料”、“形状”或“颜色”(ID 1、4 和 8)——这些是树形菜单标题,但我需要能够捕获与此类标题的所有元素相关的文章。跨度>
-
您应该如何区分什么是标头和什么是标头类型?除非你硬编码标题的 id,否则似乎会有一些问题。
-
左/右坐标定义每条记录的级别和从属关系 - 参见嵌套集模型
标签: mysql select sequence where