MySQL:同時使用 DISTINCT 和 GROUP BY?
我看到了以下同時使用 DISTINCT 和 GROUP BY 的 MySQL 查詢:
SELECT DISTINCT user_id, post_id, post_content FROM some_table GROUP BY post_id, user_id HAVING post_content LIKE '%abc%';
這是一個與查詢一起使用的場景:每個使用者都有一個唯一的 id ,
user_id
並且可以發布多個由唯一 id 標識的文章post_id
。每個文章都會包含一些文本。我發現這令人困惑(來自 Oracle 數據庫之後)並且有以下問題:
GROUP BY
不做任何聚合而使用是什麼意思?SELECT
在vs in中切換列的順序有什麼意義GROUP BY
?- 省略第三列是什麼意思
GROUP BY
?- 為什麼
DISTINCT
與 一起使用GROUP BY
?在對最終結果完成所有分組之後還是之前執行不同的操作?
廣告 1) 舊的 mysql 數據庫,當您禁用ONLY_FULL_GROUP_BY時,您可以進行此查詢,如果 post_content 都相等,您會注意到,mysql 會返回一個隨機的非確定性值。
廣告 2) 從來沒有
廣告 3) 懶惰程式,啟用ONLY_FULL_GROUP_BY時會出錯
ad 4) 不,它會顯示所有連接到 user_id、post_id 的 post_content,類似於 addind post_content 到 Group by
就像草莓已經說過這個查詢沒有任何意義
在舊版本的 MySQL 中允許部分分組的瘋狂能力必須是最重要的競爭者之一,因為大多數在 IT 行業引起了混亂。
給定表格:
CREATE TABLE t ( x int not null primary key , y int not null ); INSERT INTO t (x,y) VALUES (1,1),(1,2);
該聲明
SELECT x, y FROM t GROUP BY x
可能意味著 (1,1) 或 (1,2) 並且 MySQL 將隨機返回其中之一。在這種情況下,DISTINCT 無關緊要,結果仍然是不確定的。
SQL92 要求 select 子句中的所有列(聚合列和常量除外)都是 GROUP BY 子句的一部分。
SQL99 稍微放寬了這個限制,允許我們從 GROUP BY 中省略在功能上依賴於其餘列的列。IE
CREATE TABLE t ( x int not null primary key , y int not null ); SELECT x, y FROM t GROUP by x
將是有效的,因為 y 是 x 的 fd
令人驚訝的是(對我來說)更高版本的 MySQL 在實現 SQL99 版本時是同類中最好的。我最近沒有檢查它,但是當我這樣做時,MySQL 很好地處理了相當複雜的場景,而 PostgreSQL 只處理了瑣碎的場景。
回答您的問題
SELECT x, y FROM t GROUP BY x, y
表示x,y的組合是一個群。在所有可能的情況下,我認為這與:
SELECT DISTINCT x, y FROM t
由於它們是在不同時間進行邏輯評估的,因此可能在某些極端情況下它們實際上會有所不同(不過我想不出一個)
2)無,在這方面它們是一組列,所以沒有順序
見上文。
SQL 查詢求值的邏輯順序是:
FROM, JOIN WHERE GROUP BY HAVING SELECT DISTINCT ORDER BY FETCH FIRST
所以 GROUP BY 應該在 DISTINCT 之前進行評估。我想不出這會很重要的情況。
在您的查詢中,我懷疑有人得到了令人困惑的結果,並試圖使用 DISTINCT 獲得另一個結果。他們可能很幸運(或不幸)得到了他們期望的結果,所以 DISTINCT 留下了。錯誤仍然存在