MySQL嵌套查询如何选择多行

时间:2012-07-09 20:22:11

标签: php mysql codeigniter

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

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

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

有解决方案吗?

5 个答案:

答案 0 :(得分: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

请参阅a working example at SQLfiddle

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

答案 1 :(得分:2)

=比较仅适用于单个值。您可以使用in与多个值进行比较:

SELECT ...
FROM yourtable
WHERE somefield IN (select somevalue from othertable);

答案 2 :(得分:0)

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

请注意:https://stackoverflow.com/a/4346009/9094

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

答案 3 :(得分:0)

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

查看完整树示例检索完整树  总之,它可以通过连接完成。

答案 4 :(得分: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), ...`