mysql如何解決評論遞歸查詢?

效果如下圖,樓層確定為2級

表數據欄位有:spirit_id,content,create_user,ip,create_time,art_id,delete_flag,parent_id

能否用sql實現呢?

除開自定義存儲過程


表自關聯一下就好了。spirit_id = parent_id


雖然我查了很多發現沒有答案...

但是還是回答一下

在SQL Server裡面用CTE解決, ORACLE裡面也有相應的解決方案(爆棧一下就找得到)

但是在MySql裡面似乎真的沒有相應的解決方案

不開存儲過程應該是可行, 但是臨時表是跑不了了.(所以沒什麼意義, 單條SQL還是搞不定, 就算黑科技執行了有什麼用呢.)


如果不止兩層的樹形結構也是可以查詢的

SELECT
a.*, b.parent_id
FROM
the_table a
INNER JOIN
the_table b ON a.parent_id = b.spirit_id
WHERE
a.art_id = "article158767679"

這樣你就把article158767679文章下面的所有樹都查出來了,會顯得很亂,如果你要查某一棵樹,可以增加一個欄位擺放樹根root,這棵樹的所有節點都必須要有這棵樹的根信息,這樣只需要把最後一個where改成a.root="some_id"就可以具體確定某一棵樹了。


我們在設計的時候都是用父ID的這種比較傳統的實現方法來的

不過區別是:所有回復不會互相嵌套,回復的父ID都是評論的ID,也就是說只存在兩級,所有的回復之前除了「回復xxx」 能看出來關係外,是沒有直接關係的。只不過所有回復按時間升序排列,所以看起來它們之間有關係。當時這樣設計的原因是這樣設計還可以同時滿足「我可以刪除回復對話的任意一條而不影響其它回復」。

A 評論了內容:內容不錯 (id: 1, parent_id: 0)
B 回復 A: 我也覺得 (id:2, parent:1)
C 回復 B: 真的不錯 (id:3, parent:1)
B 回復 A: @A 看來是真的好啊哈哈。 (id:4, parent:1)


設計問題,有更簡單的方法,你增加一個欄位full_parent_id,存儲方式為/XXX/XXX/;層級以此類推,查詢方法,select *from table where full_parent_id like %/parent_id/% order by createtime,大概就是這個意思了,靈活應用!另外,我這邊招人,感興趣的微信聯繫,18268802385待遇絕逼不錯


推薦閱讀:

MySQL 和 PostgreSQL 相比,對 JSON 的支持如何?
SQL中 LEFT JOIN ON 條件的效率高低比較?
為什麼php在向mysql提交數據時變數外要用單引號?
SQL Server 與 MySQL 性能相差多大?
產品DBA、開發DBA、運維DBA的區別?

TAG:資料庫 | SQL | MySQL | SQL語句 |