在Mysql中有很多關於遞歸SELECT查詢的問題,但大多數答案是「Mysql中的遞歸SELECT查詢沒有解決方案」。@ Symbol - Mysql中遞歸SELECT查詢的解決方案?
其實是有一定的解決方案&我想清楚地知道它,所以這個問題是對前一個問題,可以在(how-to-do-the-recursive-select-query-in-mysql)
可以找到以下假設你有這個表:
col1 - col2 - col3
1 - a - 5
5 - d - 3
3 - k - 7
6 - o - 2
2 - 0 - 8
&你想找出所有連接在COL1到值「1」的聯繫,也就是說你想打印出:
1 - a - 5
5 - d - 3
3 - k - 7
然後你可以使用這個簡單的查詢:
select col1, col2, @pv:=col3 as 'col3' from table1
join
(select @pv:=1)tmp
where [email protected]
好,好,但是,如果你的表中有2條記錄COL1包含 「1」 & 2記錄COL1含有 「3」,例如:
col1 - col2 - col3
1 - a - 5
1 - m - 9
5 - d - 3
3 - k - 7
6 - o - 2
3 - v - 10
2 - 0 - 8
然後,當用戶在col1中搜索「1」,它應該顯示所有環節連接2「1」,即它應該顯示這個預期結果:
col1 - col2 - col3
1 - a - 5
1 - m - 9
5 - d - 3
3 - k - 7
3 - v - 10
所以,我的問題是我們如何修改上面的查詢,以便它會顯示所有鏈接,如上面的預期結果?
編輯: @戈登, 但如果我們忽略select distinct col1, col2 from
那麼這個查詢意味着什麼,你可以在這方面的工作(因爲childID的得到了提高,所以我們可以訂購表1):
select col1, col2,
@pv:=(case when find_in_set(col3, @pv) then @pv else concat(@pv, ',', col3)
end) as 'col3'
from (select * from table1 order by col1) tb1 join
(select @pv:='1') tmp
on find_in_set(col1, @pv) > 0
在這種情況下,我們不擔心順序,例如,如果是這樣的數據:
col1 - col2 - col3
4 - a - 5
1 - d - 2
1 - k - 4
2 - o - 3
6 - k - 8
8 - o - 9
輸出將是:
col1 - col2 - col3
1 - d - 1,2
1 - k - 1,2,4
2 - o - 1,2,4,3
所以我們得到這個結果1,2,4,3
對不對? &我們只需選擇所有記錄,如果col1在1,2,4,3
。然後我們可以得到最終的預期結果。
如果是這樣的話,你能想到任何特殊情況,排除我剛剛提到的解決方案嗎?
這似乎是一個問題,它依賴於以正確的順序返回的記錄。例如,如果我將測試數據插入到表中,但將其插入到相反的順序中,則SQL僅返回第一行(其中col1 = 1)。其他記錄在找到父母之前已被處理並丟棄。爲了解決這個問題,您需要添加一個訂單子句,並且沒有明顯的方法來爲您的數據做到這一點。下面的@GordonLinoff解決方案遭受類似的痛苦。 – Kickstart 2013-05-14 12:35:25
是的,那是第二個 – Tum 2013-05-14 13:39:42
也許,那些說遞歸SELECT沒有解決方案的人有第二個問題。 (意思是說,畢竟沒有實際的,可靠的解決方案。) – 2013-05-16 18:21:42