Php 如何根据相关表的结果选择MySQL记录?

Php 如何根据相关表的结果选择MySQL记录?,php,mysql,join,Php,Mysql,Join,在这个场景中,我有两个表:members和team_members。members表是很自然的。团队成员表存储成员的团队信息(如果他们是团队成员)。如果团队成员表中没有具有用户成员id的行,则他们不在团队中。我想做的是获取所有不是团队成员的用户。我应该使用左连接、内连接、外连接还是直接连接?这个查询是什么样子的 CREATE TABLE IF NOT EXISTS `members` ( `member_id` int(15) NOT NULL AUTO_INCREMENT, `grou

在这个场景中,我有两个表:members和team_members。members表是很自然的。团队成员表存储成员的团队信息(如果他们是团队成员)。如果团队成员表中没有具有用户成员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;

有几种方法可以编写此查询

对我来说,这是最容易阅读和理解的:

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)

从表面上看,下面的查询很好

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_左栏,如果您只想要那些尚未离开团队的成员,那么

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示例

最好避免,我个人最喜欢的是第二个。这是假设您在最初留下的日期中存储了一个“”。您提供的第二个查询正是我需要的。但是,team_members.date_left!='')其实不应该有一个!因为这会让离开团队的成员。但是谢谢你@鞋带1291,谢谢你的评论,很高兴我能帮忙,我已经在小提琴上再次测试了这个查询,尽管它看起来有点混乱,但它给我带来了正确的结果,谢谢你接受