2013-08-24 5 views
0

У меня есть две таблицы в этом сценарии: члены и team_members. Таблица участников довольно понятна. Таблица членов команды хранит информацию о команде члена, если она является членом команды. Если в таблице членов группы нет строки, которая имеет member_id пользователя, то они не находятся в команде. То, что я хочу сделать, - это получить всех пользователей, которые не являются членами команды. Должен ли я использовать левое соединение, внутреннее соединение, внешнее соединение или просто присоединиться? Как выглядит этот запрос?Как выбрать записи MySQL на основе результатов из связанной таблицы?

CREATE TABLE IF NOT EXISTS `members` (
    `member_id` int(15) NOT NULL AUTO_INCREMENT, 
    `group_id` int(15) NOT NULL, 
    `display_name` text NOT NULL, 
    `email_address` text NOT NULL, 
    `password` text NOT NULL, 
    `status` tinyint(1) NOT NULL, 
    `activation_code` varchar(16) NOT NULL, 
    `date_joined` text NOT NULL, 
    PRIMARY KEY (`member_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

CREATE TABLE IF NOT EXISTS `team_members` (
    `team_member_id` int(15) NOT NULL AUTO_INCREMENT, 
    `member_id` int(15) NOT NULL, 
    `team_id` int(15) NOT NULL, 
    `date_joined` text NOT NULL, 
    `date_left` text NOT NULL, 
    `total_xp` int(15) NOT NULL, 
    PRIMARY KEY (`team_member_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

ответ

0

На лицо его, ниже запрос отлично

SELECT members.member_id 
FROM members 
     LEFT OUTER JOIN team_members 
        ON team_members.member_id = members.member_id 
WHERE team_members.member_id IS NULL 

Это будет делать, но читать ваш вопрос еще раз, вы, кажется, есть date_left столбец, и если вы хотите только те члены, которые еще не оставил чай м, то

SELECT members.member_id 
FROM members 
     LEFT OUTER JOIN (SELECT * 
         FROM team_members 
         WHERE team_members.date_left != '') CURRENT_TEAMS 
        ON CURRENT_TEAMS.member_id = members.member_id 
WHERE CURRENT_TEAMS.member_id IS NULL 

SQLFiddle пример http://www.sqlfiddle.com/#!2/46b25/6/0

+0

Это предполагает, что вы храните «» в дату осталось первоначально – skv

+0

Второй запрос Предоставлена именно то, что мне нужно. Однако team_members.date_left! = '') На самом деле не должно быть! так как это получает членов, которые покинули команду. Но спасибо! – ShoeLace1291

+0

@ ShoeLace1291, спасибо за комментарий, рад, что я мог бы помочь, я снова проверил запрос в скрипке, и хотя это выглядит немного запутанным, это принесло мне правильные результаты, спасибо за принятие – skv

1

Существует несколько способов написать этот запрос.

Для меня это легче читать и понимать:

select * from members where member_id not in (select member_id from team_members). 

Это очень простой способ, чтобы написать ее. Если вы решили, что вы хотите, все, что вы можете быстро закомментировать пункт, где:

select m.* from members m left outer join team_members tm on m.member_id = tm.member_id 
where tm.member_id is null 

Таким образом, кажется, не очень популярен из SQL я прочитал, но я думаю, что это просто:

select m.* from members m where not exists 
    (select member_id from team_members tm where tm.member_id = m.member_id) 
+0

Ее желательно избегать, мой личный фаворит будет второй – skv

Смежные вопросы