MySQL データベース内の複数のテーブルに対して結合クエリを実行すると、重複した値が頻繁に発生するため、重複排除が必要になります。重複を削除する方法をいくつか紹介します。
1. MySQL ジョイントテーブルクエリの重複排除
1. 個別のキーワードを使用する
SELECT DISTINCT *
FROM table1
JOIN table2
ON table1.id = table2.id;
2. GROUP BYを使用する
SELECT *
FROM table1
JOIN table2
ON table1.id = table2.id
GROUP BY table1.id;
3. サブクエリを使用する
SELECT *
FROM (SELECT *
FROM table1
GROUP BY id) sub1
JOIN (SELECT *
FROM table2
GROUP BY id) sub2
ON sub1.id = sub2.id;
2. ORDER BY で DISTINCT を使用するときにスローされる例外の問題を解決する
DISTINCT をORDERと組み合わせて使用する場合、ソートに使用するフィールド ( order by sort_num ) が選択リストに含まれている必要があります。そうでない場合は、次のような MySQL 例外プロンプトがスローされます。
原因: java.sql.SQLException: ORDER BY 句の式 #1 が SELECT リストに存在せず、列 'xxx.x を参照しています。sort_num ' は SELECT リストにありません。これは DISTINCT と互換性がありません
解決策の手順:
1. ONLY_FULL_GROUP_BY ルールの検証がオンになっているかどうかを確認します
SELECT @@GLOBAL.sql_mode;
// 查询结果:
ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
SELECT @@SESSION.sql_mode;
// 查询结果:
ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
2. ONLY_FULL_GROUP_BY ルールの検証をオフにする
// 去掉“ONLY_FULL_GROUP_BY,”后的值
set @@GLOBAL.sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
set @@SESSION.sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
3. MySQL サーバーを再起動します。
# 该令如执行失败,会提示:Redirecting to /bin/systemctl start mysql.service
service mysqld start;
# 上面命令如果执行失败,可改用此命令
systemctl start mysqld