7

project1つが複数に属することができるモジュールの実装に問題がありますcategories。例:プロジェクト「PHPProgrammer」は、プログラミング、PHPのカテゴリに属しています。

次のクエリを想定します(カテゴリ1、3、11に属するプロジェクトを選択します)。

SELECT projects.* FROM projects 
    LEFT JOIN pojects_category on projects.id = pojects_category.project_id 
    WHERE pojects_category.category_id IN (1,3,11) and projects.id='94'`

=のテーブルに2つの一致があるため、同じプロジェクトが2回返されます。project_categoryproject_id94

テーブルprojects_categoryスキーマ:

CREATE TABLE IF NOT EXISTS `pojects_category` (
  `project_id` int(10) NOT NULL,
  `category_id` int(10) NOT NULL,
  KEY `category_id` (`category_id`),
  KEY `project_id` (`project_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;


INSERT INTO `pojects_category` (`project_id`, `category_id`) VALUES
(94, 3),
(94, 1);

私は何かが足りないのですか?

解決策GROUP BYまたはを使用するDISTINCT

4

2 に答える 2

10

いいえ、これで問題ありません。DISTINCTこれは、キーワードを使用して重複を削除する場合のまれなケースの1つにすぎません。

この場合、これは、複数の行を返す場合でも、クエリのロジックが正しいという事実によって正当化されます。多くのDISTINCT場合、クエリのロジックが実際に間違っている場合の使用法を確認できます。

サイドノート:

  • WHERE句で使用しIS NULL/IS NOT NULLているテーブル参照のフィルターは、LEFT JOINこの同じテーブル参照のフィルターINNER JOINを、最終的な結果セットの動作と同様に、に変換します。(これを参照してください:https ://stackoverflow.com/a/15483895/1291428 )
  • 2つの理由から、GROUP BYの効果をシミュレートするために使用するべきではありません。DISTINCT

    1/これは目的ではありません。の効果の1つはGROUP BY重複を排除することですが、その主な目的は、いくつかの分析計算/操作を適用するために、特定の基準セットに従って行をグループ化することです。

    2 /結果(mysql内)GROUP BYORDER BY、必ずしも必要なものではなく、その場合は実行速度が低下します。エンジンが提供するものを適切に使用するようにしてください。これは、上位互換性の観点から常に優れています。(許可されたものとして含めるものは実際にはそうではないことを期待して)

よろしく。

于 2012-07-10T15:08:00.880 に答える
1

これを「IN」として書き直して、重複を回避することもできます。

SELECT projects.*
FROM projects      
where projects.id in (select project_id
                      from projects_category
                      WHERE pojects_category.category_id IN (1,3,11)
                     ) and
      projects.id='94'

「in」は、レコードのフィルタリングに結合を使用しているときに重複が形成されるのを防ぎます。

于 2012-07-10T16:04:16.237 に答える