【问题标题】:How to chain SQL select results in one query?如何在一个查询中链接 SQL 选择结果?
【发布时间】:2013-11-09 07:33:01
【问题描述】:

我在选择具有子/父关系的多个结果时遇到了困难。这是带有类别树的表格。 category 表代表关系,而category_name 表包含名称字符串:

[category]                 [category_name]
id, id_parent              id, name
-------------              --------------
1   NULL                   1   'animal'
2   1                      2   'mammal'
3   2                      3   'lion'
4   2                      4   'sea_creature'
5   4                      5   'lion'

作为输入,我有名字,必须翻译成 id。层次结构正好是 3 级深。例如:animal, mammal, lion, -> 1, 2, 3

如您所见,lion 名称用于不同的类别。但是,上一级类别是唯一的,子类别的名称在一个父类别中是唯一的。

我可以进行三个单独的查询,从 animal 开始,然后重用其 id 以与后续查询的 id_parent 进行比较:

查询 #1:

SELECT
    cn.id
FROM
    category_name cn
WHERE
    cn.name = 'animal'

(将此查询的结果保存在变量parent中)

查询 #2:

SELECT
    cn.id
FROM
    category_name cn
INNER JOIN category c ON cn.id = c.id
WHERE
    cn.name = 'mammal' AND c.id_parent = <parent>

等等。但我确信有更好的方法来做到这一点。

谢谢。

【问题讨论】:

  • 您可以使用“UNION”并确保使用它时的性能。

标签: mysql sql


【解决方案1】:

我想这就是你要找的东西:

SELECT c1.id, c2.id, c3.id
FROM category c1
JOIN category c2 ON c1.id = c2.id_parent
JOIN category c3 ON c2.id = c3.id_parent
JOIN category_name cn1 ON c1.id = cn1.id
JOIN category_name cn2 ON c2.id = cn2.id
JOIN category_name cn3 ON c3.id = cn3.id
WHERE cn1.name = 'animal' AND cn2.name = 'mammal' AND cn3.name = 'lion'

输出

| C1ID | C2ID | C3ID |
|------|------|------|
|    1 |    2 |    3 |

小提琴here.

作为旁注,我建议您向 Google 推荐“嵌套集”和“邻接列表”。

【讨论】:

  • 谢谢!这正是我所需要的。
猜你喜欢
  • 2012-02-24
  • 1970-01-01
  • 1970-01-01
  • 2022-01-10
  • 1970-01-01
  • 2022-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多