web-dev-qa-db-ja.com

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 DBから来た後)。以下の質問がありました:

  1. 集計を行わずにGROUP BYを使用する意味は何ですか?
  2. SELECTGROUP BYで列の順序を切り替えることの意味は何ですか?
  3. GROUP BYから3列目を省略する意味は何ですか?
  4. DISTINCTGROUP BYと共に使用されるのはなぜですか?最終結果ですべてのグループ化が行われた後、またはその前に、個別の操作が実行されますか?

ad 1)古いmysqlデータベースで、 ONLY_FULL_GROUP_BY を無効にすると、このクエリを実行できます。post_contentがすべて等しい場合、mysqlはランダムではなく決定論的な値を返します。

ad 2)何もない

ad 3)遅延プログラミングで、有効にするとエラーが発生する ONLY_FULL_GROUP_BY

ad 4)いいえ、user_id、post_idに接続されているすべてのpost_contentをグループにaddind post_contentと同様に表示します

イチゴがすでに言ったように、このクエリは意味がありません

2
nbk

古いバージョンのMySQLで部分的なグループ化を可能にする非常識な機能は、IT業界で引き起こされるほとんどの混乱の1つの最有力候補でなければなりません。

テーブルを考えると:

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から列を除外できるようになりました。つまり.

CREATE TABLE t
( x int not null primary key
, y int not null 
);

SELECT x, y FROM t GROUP by x

yがf.dであるため有効ですxの

驚いたことに、(私にとっては)SQL99バージョンの実装に関しては、MySQLの新しいバージョンがクラス最高です。私は最近それをチェックしていませんが、MySQLを実行したとき、PostgreSQLはささいなものしか処理しなかったので、かなり複雑なシナリオをうまく処理しました。

あなたの質問に答えるために

1)

SELECT x, y FROM t GROUP BY x, y

x、yの組み合わせがグループであることを意味します。考えられるすべての状況で、これは次のように考えることができます。

SELECT DISTINCT x, y FROM t  

それらは異なる時点で論理的に評価されるため、実際には異なるいくつかのケースがあるかもしれません(私は1つとは思えません)

2)なし。これに関して、列のセットであるため、順序はありません。

3)上記を参照してください。

4)SQLクエリの論理的な評価順序は次のとおりです。

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

したがって、GROUP BYはDISTINCTの前に評価されることになっています。これが問題になるような状況は考えられません。

あなたのクエリでは、誰かが混乱した結果を得たと思い、DISTINCTを使用して別の結果を取得しようとしました。彼らはおそらく幸運(または不幸)で期待どおりの結果を得ることができたので、DISTINCTは残りました。バグはまだあります

2
Lennart