簡體   English   中英

查詢多對多關系增加了難度

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM