0

私は次のように2つのテーブルを持っています-

CREATE TABLE IF NOT EXISTS `nl_members` (
  `member_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `member_email` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
  `member_confirmation_code` varchar(35) COLLATE utf8_unicode_ci NOT NULL,
  `member_enabled` enum('Yes','No') COLLATE utf8_unicode_ci NOT NULL DEFAULT 'Yes',
  PRIMARY KEY (`member_id`),
  UNIQUE KEY `TUC_nl_members_1` (`member_email`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=58520 ;

CREATE TABLE IF NOT EXISTS `nl_member_group_xref` (
  `group_id` int(10) unsigned NOT NULL,
  `member_id` int(10) unsigned NOT NULL,
  `member_subscribed` enum('Yes','No') COLLATE utf8_unicode_ci NOT NULL DEFAULT 'Yes',
  `subscribe_date` int(10) unsigned NOT NULL DEFAULT '0',
  `unsubscribe_date` int(10) unsigned NOT NULL DEFAULT '0',
  PRIMARY KEY (`group_id`,`member_id`),
  KEY `nl_members_nl_member_group_xref` (`member_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;


ALTER TABLE `nl_member_group_xref`
 ADD CONSTRAINT `nl_members_nl_member_group_xref` FOREIGN KEY (`member_id`) REFERENCES `nl_members` (`member_id`),
 ADD CONSTRAINT `nl_member_groups_nl_member_group_xref` FOREIGN KEY (`group_id`) REFERENCES `nl_member_groups` (`group_id`);

どちらにも、数百万ものデータが大量にあります。

私が望んでいるのは、結果セットにマイナスを適用することでした。

例えば、

ID:1のGroup1からすべてのユーザーを取得したいマイナスID:2のGroup2とID:3のGroup3のすべてのユーザーを取得したい

どうすれば効率的にそれを行うことができますか?クエリは可能な限り高速に実行されます。

アップデート

私が欲しいのはこんな感じです-

メンバーテーブル'nl_members'に、1つ以上のグループに関連付けられている可能性のあるすべてのメンバーのリストを保持します。

メンバーのグループの関連付けごとに、「nl_member_group_xref」テーブルに行があります。

したがって、メンバーが3つのグループに関連付けられている場合、member_group_xrefテーブルには3つのエントリがあります。

今私が欲しいのは、すべてのメンバーをグループ1に含め、メンバーがグループ2とグループ3にも属している場合はメンバーを除外することです。

お役に立てれば。

4

2 に答える 2

0

更新された質問については、2 つのテーブルを結合し、members_id でグループ化する必要があります。探している結果が表示されるかどうかについては、以下のクエリを参照してください。

更新しました:

  SELECT 
         nm.*, nmgx.*
    FROM nl_members nm
   INNER JOIN nl_member_group_xref nmgx
      ON nm.member_id = nmgx.member_id
    LEFT JOIN (SELECT 
                      nmgx2.member_id
                 FROM nl_member_group_xref nmgx2
                WHERE nmgx2.group_id <> 1) nmgx22
      ON nmgx22.member_id = nm.member_id
   WHERE nmgx22.member_id IS NULL
   GROUP BY nm.member_id;

注: * を使用してすべてのフィールド名を取得しました。特定のフィールドを取得すると、結果が少なくなるため、クエリがより高速になります。元。nm.member_id のような member_id

これがあなたが探しているものでない場合は、お知らせください。このクエリをできる限り正確に更新します

于 2011-04-11T08:19:02.923 に答える
0

MINUS演算子を使用してみましたか?

于 2011-04-11T04:57:50.227 に答える