這個問題是可見谷歌,有很多意見,所以我想分享我的方法解決這個問題。我不得不將這種糟糕的設計作爲以逗號分隔的值存儲爲字符串來處理。我在調整CMS負責標籤的插件時遇到了這個問題。
是的,與網站文章相關的標籤存儲如下:「tag1,tag2,...,氨基胍「因此,獲得完全匹配的不是,因爲它可能最初是微不足道的出現:使用簡單LIKE
,與文章標籤‘球’我也得到了那些標記爲‘腳球’和」 球房」。不是關鍵,而是討厭。
FIND_IN_SET功能起初看起來真棒但後來事實證明,它不使用索引,如果第一個參數包含一個逗號不能正常工作。
我不想改變插件本身或更深的CMS核心這個插件是建立在這個功能上的。
另外值得一提的是,需要的標籤(substring)可以是字符串中的第一個,也可以是中間的某個地方,因此這段代碼WHERE (',' + Categories + ',') LIKE '%,science,%'
並不包含所有三種情況。
最後,我結束了非常簡單的解決方案。它的工作對我來說是這樣的:
... WHERE tags LIKE 'ball,%' OR tags LIKE '%,ball,%' OR tags LIKE '%,ball'
覆蓋所有三項方的案件;逗號作爲分隔符。希望它能幫助那些遇到過類似陷阱的人。
PS。我不是一個MySQL/DB專家,我很想閱讀這種方法的潛在缺陷,特別是在真正巨大的表格上(這不是我的情況,順便說一句)。我只是分享了我的小型研究的成果,以及我以最小的努力解決了這個問題。
這就是爲什麼多值屬性是**邪惡**。 – Yuck 2012-02-23 22:09:16
@Yuck我認爲併發問題的增加是他們爲什麼**邪惡**。 – 2012-02-23 22:10:40
我不會讓這個設計站得住腳。你需要一個子表格來存儲數據,這樣你纔能有效地對它進行調整。永遠不要存儲逗號列表。 – HLGEM 2012-02-23 22:12:27