透過多個 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 BY
s.
有效的解
有幾種方法可以防止這些重複:
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中文網其他相關文章!