【发布时间】:2011-08-02 18:40:19
【问题描述】:
我有 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 为 1 的 Group1 中的所有用户,减去 ID 为 2 的 Group2 和 ID 为 3 的 Group3 中的所有用户
我怎样才能有效地做到这一点?尽可能快地运行查询。
更新
我想要的是这样的——
在成员表“nl_members”中,我保留了所有成员的列表,这些成员可能与一个或多个组相关联。
对于成员的每个组关联,“nl_member_group_xref”表中都会有一行。
因此,如果一个成员与 3 个组相关联,则 member_group_xref 表中将有 3 个条目。
现在我想要的是让所有成员都包含在第 1 组中,但如果他们也属于第 2 组和第 3 组,则排除他们。
希望这会有所帮助。
【问题讨论】:
-
您有现有的查询吗?如果您说要将 group2 和 3 中的所有用户减去 1,我认为这是数字结果。但是您说所有用户,那么这意味着每个用户的数据。所以我对你的问题的理解是 LIMIT = 0,(G1 - (G2 + G3)) 其中限制将包括在你的查询结束时。如果我的理解有误,您介意再解释一下吗?
标签: mysql query-optimization large-data