[英]Querying a many-to-many relationship with added difficulty
這是我的問題:我有兩個通過聯結表連接的表。 我在Apache服務器上使用MySQL和PHP(Yii2),但它只是我需要幫助的SQL。
| Objects | ObjectHasTag | Tag |
|---------------------------------------------|
| - id | -object_id | -id |
| - name | -tag_id | -tag |
我需要創建一個查詢,該查詢返回帶有多個標簽標記的對象,而我的問題是,作為一種可公開訪問的功能,該查詢是否可以以合理的效率實現。
示例:查找所有帶有標簽“ tagone”,“ tagtwo”和“ tagthree”的對象。
我有一個可行的解決方案,那就是在Objects-table中有一個'tags'列,所有的標簽名都用逗號分開。 這似乎不是“最佳實踐”這種解決方案。
非常感謝你們能提供的任何幫助!
SQL相對簡單:
SELECT *
FROM Objects o
WHERE 3 = (
SELECT COUNT(DISTINCT t.id)
FROM ObjectHasTag ot
JOIN Tag t ON t.id=ot.tag_id
WHERE o.id = ot.object_id
AND t.tag IN ('tag1', 'tag2', 'tag3')
)
COUNT(DISTINCT t.id)
將ObjectHasTag
連接到Tag
,在要搜索的列表上過濾Tag
,並計算不同標簽的數量。 為了選擇對象,必須列出IN
列表中的所有三個項目。 例如,如果您知道ObjectHasTag
不能包含重復標記,因為您在表上具有唯一索引或約束,則可以將COUNT(DISTINCT t.id)
替換為COUNT(*)
。
o.id = ot.object_id
條件將嵌套查詢“連接”到從“ Objects
表中選擇的Objects
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.