概要 中小規模のプロジェクトでは、特にレポートを作成するときに、結合テーブル クエリが非常に一般的な操作になります。しかし、データを校正する際に、何か落とし穴は見つかりましたか?この記事では、MySQL でよく使用される結合テーブル クエリの一般的な落とし穴を再現します。 基本環境 テーブルステートメントの作成 `role` が存在する場合はテーブルを削除します。 テーブル `role` を作成します ( `id` int(11) NOT NULL AUTO_INCREMENT, `role_name` VARCHAR(50) DEFAULT NULL COMMENT 'ロール名', 主キー (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='role table'; `role` VALUES(1, 'Administrator') に挿入します。 `role` VALUES(2, 'ゼネラルマネージャー') に挿入します。 `role` VALUES(3, 'Section Chief') に挿入します。 `role` VALUES(4, 'チームリーダー') に挿入します。 `user` が存在する場合はテーブルを削除します。 テーブル `user` を作成します ( `id` int(11) NOT NULL AUTO_INCREMENT, `role_id` int(11) NOT NULL COMMENT 'ロールID', `user_name` VARCHAR(50) デフォルト NULL コメント 'ユーザー名', `sex` int(1) デフォルト 0 コメント '性別', 主キー (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='ユーザーテーブル'; `user` VALUES(1, 1, 'admin', 1) に挿入します。 `user` VALUES(2, 2, 'Manager Wang', 1) に挿入します。 `user` VALUES(3, 2, 'Manager Li', 2) に挿入します。 `user` VALUES(4, 2, 'Manager Zhang', 2) に挿入します。 `user` VALUES(5, 3, 'Section Chief Wang', 1) に挿入します。 `user` VALUES(6, 3, 'Section Chief Li', 1) に挿入します。 `user` VALUES(7, 3, 'Lv Section Chief', 2) に挿入します。 `user` VALUES(8, 3, 'Section Chief Xing', 1) に挿入します。 `user` VALUES(9, 4, 'Team Leader Fan', 2) に挿入します。 `user` VALUES(10, 4, 'Team Leader Zhao', 2) に挿入します。 `user` VALUES(11, 4, 'Ji Team Leader', 1) に挿入します。 データは以下のとおりです mysql> ロールから * を選択します。 +----+-----------+ | ID | ロール名 | +----+-----------+ | 1 | 管理者 | | 2 | ゼネラルマネージャー| | 3 | 課長 | | 4 | チームリーダー| +----+-----------+ セット内の 4 行 (0.00 秒) mysql> ユーザーから * を選択します。 +----+---------+----------+------+ | ID | ロールID | ユーザー名 | 性別 | +----+---------+----------+------+ | 1 | 1 | 管理者 | 1 | | 2 | 2 | 王監督 | 1 | | 3 | 2 | マネージャー リー | 2 | | 4 | 2 | 張マネージャー | 2 | | 5 | 3 | 王課長 | 1 | | 6 | 3 | 李課長 | 1 | | 7 | 3 | ルー課長 | 2 | | 8 | 3 | 邢課長 | 1 | | 9 | 4 | チームリーダーファン | 2 | | 10 | 4 | チームリーダー 趙 | 2 | | 11 | 4 | チームリーダー ジ | 1 | +----+---------+----------+------+ セット内の行数は 11 です (0.00 秒) 基本的なビジネス シンプルな情報レポート: ユーザー情報の照会 mysql> 選択 -> ID、 -> ユーザー名 AS '名前'、 -> ( CASE WHEN sex = 1 THEN '男性' WHEN sex = 2 THEN '女性' ELSE '不明' END ) AS '性別' -> から -> ユーザー; +----+-----------+--------+ | ID | 名前 | 性別 | +----+-----------+--------+ | 1 | 管理者 | 男性 | | 2 | マネージャー王 | 男性 | | 3 | マネージャー Li | 女性 | | 4 | マネージャー張 | 女性 | | 5 | 王課長 | 男性 | | 6 | 李課長 | 男性 | | 7 | ルー課長 | 女性 | | 8 | 課長 邢 | 男性 | | 9 | チームリーダーファン | 女性 | | 10 | チームリーダー 趙 | 女性 | | 11 | Ji チームリーダー | 男性 | +----+-----------+--------+ 各役職名と対応する人員の女性数を照会する mysql> 選択 -> r.id、 -> r.role_name AS ロール、 -> count( u.sex ) 性別として -> から -> 役割 r -> LEFT JOIN USER u ON r.id = u.role_id -> AND u.sex = 2 -> グループ化 -> r.ロール名 -> 順序 -> r.id ASC; +----+-----------+-----+ | ID | 役割 | 性別 | +----+-----------+-----+ | 1 | 管理者 | 0 | | 2 | ゼネラルマネージャー | 2 | | 3 | 課長 | 1 | | 4 | チームリーダー | 2 | +----+-----------+-----+ セット内の 4 行 (0.00 秒) 性別フィルタリング条件を where 操作に変更するとどうなりますか? mysql> 選択 -> r.id、 -> r.role_name AS ロール、 -> count( u.sex ) 性別として -> から -> 役割 r -> LEFT JOIN USER u ON r.id = u.role_id -> どこ -> 米国の性別 = 2 -> グループ化 -> r.ロール名 -> 順序 -> r.id ASC; +----+-----------+-----+ | ID | 役割 | 性別 | +----+-----------+-----+ | 2 | ゼネラルマネージャー | 2 | | 3 | 課長 | 1 | | 4 | チームリーダー | 2 | +----+-----------+-----+ セット内の 3 行 (0.00 秒) ここで、文字データが不完全であることがわかります。 ゼネラルマネージャーの役割を持つ従業員の数を調べる mysql> 選択 -> r.id、 -> r.role_name AS ロール、 -> count( u.sex ) 性別として -> から -> 役割 r -> LEFT JOIN USER u ON r.id = u.role_id -> どこ -> r.role_name = 'ゼネラルマネージャー' -> グループ化 -> r.ロール名 -> 順序 -> r.id ASC; +----+-----------+-----+ | ID | 役割 | 性別 | +----+-----------+-----+ | 2 | ゼネラルマネージャー | 3 | +----+-----------+-----+ セット内の 1 行 (0.00 秒) また、フィルター条件を「どこ」から「オン」に変更します mysql> 選択 -> r.id、 -> r.role_name AS ロール、 -> count( u.sex ) 性別として -> から -> 役割 r -> LEFT JOIN USER u ON r.id = u.role_id -> AND r.role_name = 'ゼネラルマネージャー' -> グループ化 -> r.ロール名 -> 順序 -> r.id ASC; +----+-----------+-----+ | ID | 役割 | 性別 | +----+-----------+-----+ | 1 | 管理者 | 0 | | 2 | ゼネラルマネージャー | 3 | | 3 | 課長 | 0 | | 4 | チームリーダー | 0 | +----+-----------+-----+ セット内の 4 行 (0.00 秒) ここで、データが冗長であることがわかります。 要約する 左の結合ステートメントでは、左のテーブル フィルターを where 条件に配置し、右のテーブル フィルターを on 条件に配置する必要があります。これにより、結果が多すぎず少なすぎず、ちょうどよくなります。 これで、MySQL 結合テーブル クエリの基本操作である左結合のよくある落とし穴に関するこの記事は終了です。MySQL 結合テーブル クエリの左結合に関する関連コンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
>>: Alibaba Cloud Server にセキュリティ グループ ルールを追加する詳細な説明 (グラフィック チュートリアル)
1. ユーザーにルーチン作成権限がある場合は、プロシージャ | 関数を作成できます。 2. ユーザー...
1. サービス方法ファイアウォールのステータスを確認します。 [root@centos6 ~]# サ...
この記事では、最新バージョンの MySQL データベース、つまり MySQL 5.7.17 圧縮バー...
目次1. はじめに2. ルール検証の入力モード2.1 サンプルコード2.2、フォーム項目2.3. 小...
1. ネットワークの最適化YSlowには23のルールがあります。これら数十のルールは、主に、不要な...
まず、PHP5をインストールするのはとても簡単ですyum install php PHP5 を使用し...
コンテナが起動した後まず管理者にログインして新しいユーザーを作成してください $ docker ex...
導入あなたも面接でこれに遭遇したことがあるはずです。トランザクションの分離レベルについてお話ししまし...
勉強の計画は簡単に中断され、継続するのが困難です。先日、社内で事業の方向性を調整するための会議があり...
Linux サーバーのホスト ファイルの構成hosts ファイルは、Linux システム内の IP ...
今日、Dockerfile を使用してイメージを作成したときに問題が発生し、イメージの実行後にコンテ...
目次同時シナリオ書き込む読む読む読み取り-書き込みと書き込み-読み取りMySQL のロック行レベルロ...
MySQL 8.0 Windows zipのインストール手順は次のように紹介されています。準備する:...
vue+el-upload 複数ファイルの動的アップロード、参考までに具体的な内容は以下のとおりです...
この記事では、コードレイン特殊効果を実現するためのjQueryプラグインの具体的なコードを参考までに...