【问题标题】:How do I select MySQL records based on results from a related table?如何根据相关表的结果选择 MySQL 记录?
【发布时间】:2013-08-24 05:28:06
【问题描述】:

在这种情况下,我有两个表:members 和 team_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;

【问题讨论】:

    标签: php mysql join


    【解决方案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)
    

    【讨论】:

    • 最好避免IN,我个人最喜欢的是第二个
    【解决方案2】:

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

    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

    【讨论】:

    • 这是假设您在最初留下的日期中存储了一个 ''
    • 您提供的第二个查询正是我所需要的。但是, team_members.date_left != '') 实际上不应该有 !因为这会得到离开团队的成员。不过谢谢!
    • @ShoeLace1291,感谢您的评论,很高兴我能提供帮助,我在小提琴中再次测试了查询,尽管它看起来有点令人困惑,但它给我带来了正确的结果,谢谢接受
    猜你喜欢
    • 1970-01-01
    • 2018-09-24
    • 1970-01-01
    • 2019-10-01
    • 1970-01-01
    • 2014-10-13
    • 1970-01-01
    • 2011-11-07
    • 2011-09-29
    相关资源
    最近更新 更多