首頁 > 資料庫 > mysql教程 > 當加入多個「GROUP_BY」時,如何避免在「GROUP_CONCAT」中出現重複?

當加入多個「GROUP_BY」時,如何避免在「GROUP_CONCAT」中出現重複?

Linda Hamilton
發布: 2025-01-18 06:16:09
原創
309 人瀏覽過

How to Avoid Duplicates in `GROUP_CONCAT` When Joining Multiple `GROUP_BY`s?

透過多個 GROUP_CONCAT 連線解決 GROUP BY 中的重複結果

透過 GROUP BY 組合多個 LEFT JOIN 子句並使用 GROUP_CONCAT 可能會導致重複的條目。這是由於合併每個 GROUP BY 中的唯一鍵而導致的,導致資料表示不準確。

問題場景

考慮這個查詢結構:

<code class="language-sql">SELECT
    q1.user_id, q1.user_name, q1.score, q1.reputation, 
    SUBSTRING_INDEX(GROUP_CONCAT(q2.tag ORDER BY q2.tag_reputation DESC SEPARATOR ','), ',', 2) AS top_two_tags,
    SUBSTRING_INDEX(GROUP_CONCAT(q3.category ORDER BY q3.category_reputation DESC SEPARATOR ','), ',', 2) AS category
FROM
    (...) AS q1
    LEFT JOIN (...) AS q2 ON q2.user_id = q1.user_id 
    LEFT JOIN (...) AS q3 ON q3.user_id = q1.user_id 
GROUP BY
    q1.user_id, q1.user_name, q1.score, q1.reputation</code>
登入後複製

此查詢旨在檢索每個使用者的前兩個標籤和類別,假設使用者、標籤、信譽、post_tag、類別和 post_category 表。 問題是由於加入了 GROUP BYs.

,可能會出現「css,css」或「technology,technology」等重複項。

有效的解

有幾種方法可以防止這些重複:

1。分離 GROUP BY 和內連接:

<code class="language-sql">-- Separate grouping and joining approach
SELECT
    q1.user_id, q1.user_name, q1.score, q1.reputation, q1.top_two_tags, q2.category
FROM
    (SELECT
        q1.user_id, q1.user_name, q1.score, q1.reputation, 
        SUBSTRING_INDEX(GROUP_CONCAT(q2.tag ORDER BY q2.tag_reputation DESC SEPARATOR ','), ',', 2) AS top_two_tags
    FROM
        (...) AS q1
        LEFT JOIN (...) AS q2 ON q2.user_id = q1.user_id 
    GROUP BY
        q1.user_id, q1.user_name, q1.score, q1.reputation
    ) AS q1
    INNER JOIN
    (SELECT
        q1.user_id, 
        SUBSTRING_INDEX(GROUP_CONCAT(q3.category ORDER BY q3.category_reputation DESC SEPARATOR ','), ',', 2) AS category
    FROM
        (...) AS q1
        LEFT JOIN (...) AS q3 ON q3.user_id = q1.user_id 
    GROUP BY
        q1.user_id
    ) AS q2
    ON q1.user_id = q2.user_id;</code>
登入後複製

此方法首先分別對標籤和類別進行分組和連接,然後使用 INNER JOIN 上的 user_id 連接結果。 這可確保每個使用者僅產生一行。

2。 標量子查詢:

<code class="language-sql">-- Scalar subquery approach
SELECT
    q1.user_id, q1.user_name, q1.score, q1.reputation,
    (SELECT
        SUBSTRING_INDEX(GROUP_CONCAT(q2.tag ORDER BY q2.tag_reputation DESC SEPARATOR ','), ',', 2)
    FROM (...) AS q2
    WHERE q2.user_id = q1.user_id
    ),
    (SELECT
        SUBSTRING_INDEX(GROUP_CONCAT(q3.category ORDER BY q3.category_reputation DESC SEPARATOR ','), ',', 2)
    FROM (...) AS q3
    WHERE q3.user_id = q1.user_id
    )
FROM
    (...) AS q1;</code>
登入後複製

這使用 SELECT 清單中的子查詢來單獨取得每個使用者的頂級標籤和類別,避免 GROUP BY 歧義。

關鍵是在多個表上使用 GROUP_CONCAT 時,避免在單一 GROUP BY 呼叫中直接連接來自多個連接表的資料。 所選的解決方案取決於具體的資料庫結構和效能考量。 目標是產生準確、無重複的結果。

以上是當加入多個「GROUP_BY」時,如何避免在「GROUP_CONCAT」中出現重複?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板