[英]How do I structure a SELECT query for the following
希望這里有人能夠提供一些mysql建議...
我正在研究分類搜索標簽系統。 我有如下表:
EXERCISES
exerciseID
exerciseTitle
SEARCHTAGS
searchtagID
parentID ( -> searchtagID)
searchtag
EXERCISESEARCHTAGS
exerciseID (Foreign key -> EXERCISES)
searchtagID (Foreign key -> SEARCHTAGS)
搜索標簽可以排列在任意深的樹中。 因此,例如,我可能有一棵看起來像這樣的搜索標簽樹...
Body Parts
Head
Neck
Arm
Shoulder
Elbow
Leg
Hip
Knee
Muscles
Pecs
Biceps
Triceps
現在...
我想選擇樹的一個分支中的所有搜索標簽,這些樹都引用樹的一個不同分支中的單個搜索標簽所引用的記錄子集中的至少一個記錄。
例如,假設搜索標記“手臂”指向練習的子集。 如果該子集中的任何練習也被SEARCHTAGS的“ Muscles”分支的searchtag引用,那么我想為其選擇。 因此,我的查詢可能會返回“二頭肌”,“三頭肌”。
兩個問題:
1)SELECT查詢類似這樣的內容是什么? (如果這樣的事情在沒有造成很多減速的情況下甚至是可能的。我不確定從哪里開始...)
2)我應該做些什么來調整我的數據結構,以確保此查詢將繼續快速運行-即使表變大了?
在此先感謝您的幫助,不勝感激。
一個想法:考慮使用一個緩存表將所有祖先關系保存在您的搜索標記中:
CREATE TABLE SEARCHTAGRELATIONS (
parentID INT,
descendantID INT
);
還要將標簽本身包括為父標簽和后代標簽(因此,對於ID為1的searchtag,關系表包括具有(1,1)的行。
這樣,您就可以擺脫父/子關系,並可以加入一個平面表。 假設“肌肉”的ID為5,
SELECT descendantID FROM SEARCHTAGRELATIONS WHERE parentID=5
返回肌肉中包含的所有搜索標記。
或者,使用經過修改的預排序樹遍歷 ,也稱為嵌套集模型 。 它需要兩個字段(左和右),而不是一個字段(父ID),這使某些操作更加困難,但使選擇整個分支變得更加容易。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.