0

このシナリオには、members と team_members の 2 つのテーブルがあります。members テーブルは一目瞭然です。チーム メンバー テーブルには、メンバーがチームのメンバーである場合、メンバーのチーム情報が格納されます。ユーザーの member_id を持つ行がチーム メンバー テーブルにない場合、そのユーザーはチームに所属していません。私がやりたいことは、チームのメンバーではないすべてのユーザーを取得することです。左結合、内部結合、外部結合、または単に結合を使用する必要がありますか? このクエリはどのようになりますか?

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;
4

2 に答える 2

1

このクエリを記述する方法はいくつかあります。

私にとって、これは読みやすく理解しやすいです:

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

これは本当に簡単な書き方です。すべてが必要だと判断した場合は、すぐに where 句をコメントアウトできます。

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)
于 2013-08-24T05:32:02.637 に答える
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

于 2013-08-24T05:50:53.310 に答える