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`);

两者都有关于数百万的大量数据。

我想要的是高效地将 MINUS 应用于结果集。

例如,

我想获取 ID 为 Group1 的所有用户:1 减去 ID 为 2 的 Group2 和 ID 为 Group3 的所有用户:3

我怎样才能有效地做到这一点?尽可能快地运行查询。

更新

我想要的是这样的-

在成员表“nl_members”中,我保留了所有成员的列表,这些成员可能与一个或多个组相关联。

对于成员的每个组关联,“nl_member_group_xref”表中将有一行。

因此,如果一个成员与 3 个组相关联,则 member_group_xref 表中将有 3 个条目。

现在我想要的是让所有成员都包含在第 1 组中,但如果成员也属于第 2 组和第 3 组,则排除他们。

希望这可以帮助。

4

2 回答 2

0

您是否尝试过使用MINUS运算符?

于 2011-04-11T04:57:50.227 回答
0

对于您更新的问题,您需要加入两个表并将其与 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;

注意:我使用 * 来获取所有字段名称。您获得特定字段,因此查询会更快,因为它只会获得更少的结果。前任。member_id 像 nm.member_id

如果这不是您要查找的内容,请通知我,然后我会尽可能准确地更新此查询

于 2011-04-11T08:19:02.923 回答