0
SELECT id, FIO, parent_id
FROM users
WHERE parent_id =
(
    SELECT id
    FROM users
    WHERE parent_id =
    (
        SELECT id
        FROM users
        WHERE id = 16
    )
)

所以在这里我正在制作一个层次结构树,首先选择根父级,然后选择子级等到第 24 级深度。

问题是:如何从内部查询中选择多列?

因为我需要获取其他行字段来显示如下信息:name, surname, age

看起来我只能在外部查询(最顶层)中获取那些行列。

PS:我不想使用连接,因为它们会生成重复的字段。

有解决办法吗?

4

5 回答 5

4

您可以使用 MySQL 查询变量在 SQL 端进行迭代。这将返回具有一个父节点的所有数据的所有子节点,而不会重复自己(因此不会对树的深度施加限制)

像这样:(500 是父母的身份开始)

SELECT
  id,
  parent_id, 
  name, 
  '0' as depth, 
  @tree_ids := id AS foo
FROM 
   tree,
  (SELECT @tree_ids := '', @depth := -1) vars
WHERE id = 500
UNION
SELECT 
  id,
  parent_id,
  name,
  @depth := IF(parent_id = 500, 1, @depth + 1) AS depth,
  @tree_ids := CONCAT(id, ',', @tree_ids) AS foo
FROM 
  tree 
WHERE FIND_IN_SET(parent_id, @tree_ids) OR parent_id = 500

在 SQLfiddle 上查看一个工作示例

请注意,这在较大的数据集上会产生非常糟糕的性能,因为 MySQL 不会使用您的索引,而是会进行全表扫描。(我不明白为什么它不使用索引,就是这样。如果有人对索引问题有建议或解释,请发表评论!)

于 2012-07-09T21:33:54.090 回答
2

=比较仅适用于单个值。您可以in用来比较多个值:

SELECT ...
FROM yourtable
WHERE somefield IN (select somevalue from othertable);
于 2012-07-09T20:25:42.800 回答
0

将层次数据存储在 mysql 中并将其取出并不是那么简单。

看看这个:https ://stackoverflow.com/a/4346009/9094

您将需要更多数据才能使用。

于 2012-07-09T20:25:24.433 回答
0

似乎您的数据库关系设置为 MPTT,这是一篇很好的博客文章,解释了如何查询 mysql MPTT 数据 http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/

看一下完整树示例 总而言之检索完整树可以通过连接来完成。

于 2012-07-09T20:27:16.183 回答
0

我不是 100% 确定我是否完全理解您的意思,但是如果您想在子选择中从表中单独选择所有列...

col1, col2, col3, col4

您需要为每一列提供一个始终与同一个 WHERE 匹配的子选择。例子:

`SELECT * FROM main_table,
(SELECT col1 FROM inner_table WHERE inner_table.some_column=main_table.some_column),
(SELECT col2 FROM inner_table WHERE inner_table.some_column=main_table.some_column), ...`
于 2012-07-09T20:29:16.587 回答