Mysql

MySQL:同時使用 DISTINCT 和 GROUP BY?

  • April 3, 2020

我看到了以下同時使用 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 數據庫之後)並且有以下問題:

  1. GROUP BY不做任何聚合而使用是什麼意思?
  2. SELECT在vs in中切換列的順序有什麼意義GROUP BY
  3. 省略第三列是什麼意思GROUP BY
  4. 為什麼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)無,在這方面它們是一組列,所以沒有順序

  1. 見上文。

  2. SQL 查詢求值的邏輯順序是:

FROM, JOIN 
WHERE
GROUP BY
HAVING
SELECT
DISTINCT
ORDER BY
FETCH FIRST

所以 GROUP BY 應該在 DISTINCT 之前進行評估。我想不出這會很重要的情況。

在您的查詢中,我懷疑有人得到了令人困惑的結果,並試圖使用 DISTINCT 獲得另一個結果。他們可能很幸運(或不幸)得到了他們期望的結果,所以 DISTINCT 留下了。錯誤仍然存在

引用自:https://dba.stackexchange.com/questions/262408