Index

有效地列出組和子組上的排序文章

  • December 11, 2021

假設我有一個系統,其中包含組和這些組上的文章。

一個組可以有多個“子組”

第 1 組 > 第 2 組 > 第 3

組 第 1 組 > 第 2 組 > 第 4

組 第 1 組 > 第 5 組 > 第 6 組

所以我有這兩張表:

Groups (*GroupId*, Name, ParentGroupId, ...)

Posts (*PostId*, GroupId, UserId, Text, ...)

顯示第 3、4 和 6 組的最新 10 個文章的列表不是問題。一個關於它

的索引( )。GroupId``WHERE GroupId=12345 ORDER BY PostId DESC

但是,我面臨的挑戰是如何使第 2 組列表文章直接在第 2 組中創建,而且還針對兒童(第 3 組和第 4 組),以及第 1 組(第 1 組和所有兒童的列表文章) ,排序)。

我唯一能想到的就是創建一個額外的“索引表”,其中包含PostId每個父組的列表,並使用它來檢索文章。但是,恐怕維護和確保它的準確性會很痛苦(比如使用 a TRIGGER)。如果發生錯誤,然後我們必須修復索引,再次重建整個索引等等……

有沒有更好的方法來做到這一點?

我希望使用更原生和自動維護的東西。

我使用 MariaDB 10.4 和 Sphinx 搜尋。

您要解決的是一種層次結構問題。通常這些都可以通過遞歸來解決。特別是在像 MariaDB 這樣的 RDBMS 中,您可以使用稱為遞歸 CTE的東西來生成表示數據的父(祖先)/子樹狀結構的關係數據集。

就像過程語言中的遞歸一樣,在遞歸 CTE 中,有一個基本情況,即錨點和與錨點結合的遞歸情況

通用語法範例:

WITH RECURSIVE ExampleRecursiveCTE AS 
(
   -- Setting up the anchor / base case
   SELECT
       "" As ParentDescription,
       0 AS ParentId,
       "This is the base case" AS ChildDescription, 
       0 AS ChildId

   UNION ALL

   -- The recursive levels
   SELECT 
        ChildDescription AS ParentDescription, 
        ChildId AS ParentId, -- The ancestor level becomes the parent of this level
        "Some cool stuff about this child" AS ChildDescription,
        ChildId + 1 AS ChildId -- This is the new child level
   FROM ExampleRecursiveCTE
)

SELECT ParentDescription, ParentId, ChildDescription, ChildId
FROM ExampleRecursiveCTE

引用自:https://dba.stackexchange.com/questions/294962