簡體   English   中英

MySQL嵌套查詢如何選擇多個行

[英]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

在SQLfiddle上查看工作示例

請注意, 這在大型數據集上的性能確實很差,因為MySQL不會使用您的索引,而是會進行全表掃描。 (我不明白為什么它不使用索引,事實就是如此。如果有人對索引問題有建議或解釋,請發表評論!)

=比較僅對單個值起作用。 您可以使用in與多個值進行比較:

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

在mysql中存儲分層數據並將其導出並不是那么簡單。

看看這個: https : //stackoverflow.com/a/4346009/9094

您將需要更多數據才能使用。

看來您的數據庫關系已設置為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM