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から来た後)。以下の質問がありました:
GROUP BY
を使用する意味は何ですか?SELECT
とGROUP BY
で列の順序を切り替えることの意味は何ですか?GROUP BY
から3列目を省略する意味は何ですか?DISTINCT
がGROUP 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と同様に表示します
イチゴがすでに言ったように、このクエリは意味がありません
古いバージョンの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は残りました。バグはまだあります