Как эффективно применять МИНУС к запросу MySQL для таблиц с большими данными - PullRequest
0 голосов
/ 11 апреля 2011

У меня есть две таблицы:

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

Обе имеют довольно большой объем данных о миллионах из них.

Я хочу, чтобы эффективность была в примененииМИНУС на наборе результатов.

Например,

я хочу получить всех пользователей из группы 1 с идентификатором: 1 МИНУС всех пользователей из группы 2 с идентификатором: 2 и группы 3 с идентификатором: 3

Как я могу сделать это эффективно?с максимально быстрым выполнением запроса.

Обновление

Что я хочу, это так -

в таблице членов 'nl_members', я сохраняюсписок всех членов, которые могли быть связаны с одной или несколькими группами.

для каждой ассоциации группы для члена будет строка в таблице 'nl_member_group_xref'.

, так что еслиэлемент связан с 3 группами. В таблице member_group_xref будет 3 записи.

Теперь я хочу, чтобы все члены были включены в группу 1, но исключены участники, если они также принадлежат группе 2 и группе 3.

Надеюсь, это поможет.

Ответы [ 2 ]

0 голосов
/ 11 апреля 2011

Для вашего обновленного вопроса вам нужно объединить две таблицы и сгруппировать его с 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;

Примечание: я использовал *, чтобы получить все имя поля.Вы получаете конкретное поле, поэтому запрос будет быстрее, так как он будет получать меньше результатов.Ex.member_id like nm.member_id

Если это не то, что вы ищете, просто сообщите мне, тогда я обновлю этот запрос настолько точно, насколько смогу

0 голосов
/ 11 апреля 2011

Вы пытались использовать оператор MINUS ?

...