MySQL ジョイント テーブル クエリの重複排除と DISTINCT 例外の解決: ORDER BY 句の式 #1 が SELECT リストにありません。参照...

    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

おすすめ

転載: blog.csdn.net/crazestone0614/article/details/132767135