[英]MySQL nested queries how to select more than one row
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:我不想使用聯接,因為它們會生成重復的字段。
有解決方案嗎?
您可以使用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
請注意, 這在大型數據集上的性能確實很差,因為MySQL不會使用您的索引,而是會進行全表掃描。 (我不明白為什么它不使用索引,事實就是如此。如果有人對索引問題有建議或解釋,請發表評論!)
=
比較僅對單個值起作用。 您可以使用in
與多個值進行比較:
SELECT ...
FROM yourtable
WHERE somefield IN (select somevalue from othertable);
看來您的數據庫關系已設置為MPTT,這是一篇不錯的博客文章,闡述了如何查詢mysql MPTT數據http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/
看一看完整樹示例,總結一下,檢索完整樹可以通過聯接來完成。
我不確定我是否完全理解您的意思,但是如果您想在子選擇中從表中單獨選擇所有列,我不確定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), ...`
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.