2012-06-04 52 views
0

假设2个表:MySQL的:寻找孩子记录

TABLE: team 
----------- 
| team_id | 
=========== 
| 1  | 
----------- 
| 2  | 
----------- 

TABLE: team_member 
------------------------------------------- 
| team_member_id | team_id | age | gender | 
=========================================== 
| 1    | 1  | 20 | Male | 
------------------------------------------- 
| 1    | 2  | 25 | Male | 
------------------------------------------- 
| 1    | 2  | 23 | Female | 
------------------------------------------- 

我如何寻找这样的事情:

  1. 是只有男性所有球队的名单,18和25岁之间。这是男性和女性,其中任一性别是18岁的和25
  2. 等之间
0所有球队的
  • 名单

    我基本上在寻找关于如何应用某些过滤器的一般策略(例如,年龄)跨越team的所有子女记录。建议?

  • +0

    一般策略:'GROUP BY'和'HAVING'。 –

    +0

    @RayToal,GROUP BY'team_id',对吧? HAVING如何提供帮助?例如,我如何找到一个拥有3名成员,全是男性的团队?或找到所有成员都在25岁以下的团队?我遇到的问题是如何将某些条件应用于部分或全部儿童个人资料。 – StackOverflowNewbie

    回答

    1

    团队之间,team_member

    你可以如果您只查看全部男性或全部女性团队,则只应用简单的WHERE子句......需要将其与全套团队成员进行比较。尝试

    select 
         tm.team_id, 
         sum(if(tm.gender = 'Male' AND tm.age between 18 and 25, 1, 0)) as MaleInRange, 
         count(*) AllTeamMembers 
        from 
         team_member tm 
        group by 
         tm.Team_ID 
        having 
         MaleInRange = AllTeamMembers 
    

    同样,以确保你有男,女...

    select 
         tm.team_id, 
         sum(if(tm.age between 18 and 25, 1, 0)) as AgeInRange, 
         sum(if(tm.gender = 'Male', 1, 0)) as MaleCnt, 
         sum(if(tm.gender = 'Female', 1, 0)) as FemaleCnt, 
         count(*) AllTeamMembers 
        from 
         team_member tm 
        group by 
         tm.Team_ID 
        having 
         AgeInRange = AllTeamMembers 
        AND MaleCnt > 0 
        AND FemaleCnt > 0 
    
    +0

    我想我理解这个解决方案。明天会试用。顺便说一句,我不仅对性别和年龄感兴趣。我只用这些来简化我的问题。我有大约10-15个领域。这会扩大吗? – StackOverflowNewbie

    +0

    @StackOverflowNewbie,列数,我也不在乎......只是性别和年龄。只要确保你在team_id上有一个team_member的索引。至于能够用大数据进行扩展的能力,这应该不成问题......除非你拥有数百万个团队。然后,我会通过汇总值(如#men,#women,low age,high age)调整团队表格,然后您可以从中查询(使用适当的索引) – DRapp

    +0

    当您“汇总”值时,您是否意味着在父表中实际创建字段以包含这些“计算”值。如果是这样,那么这是不是正常化? – StackOverflowNewbie

    0

    您可以这样做:
    1. SELECT * FROM T2 WHERE Gender='Male' and Age BETWEEN 18 AND 25
    2. SELECT * FROM T2 WHERE Age BETWEEN 18 AND 25
    希望它有帮助!

    +0

    这并没有解决问题的实际问题。关心的是如何查询整个儿童记录。 – StackOverflowNewbie

    0

    顺便说一句team_member_id必须是唯一的,否则这个列是无用的!

    列表是男性和女性的所有球队,其中任一性别是18岁的和25

    SELECT * FROM team_member WHERE Age BETWEEN 18 AND 25 GROUP BY team_id. 
    

    结果

    | team_member_id | team_id | age | gender | 
    =========================================== 
    | 1    | 1  | 20 | Male | 
    ------------------------------------------- 
    | 1    | 2  | 25 | Male | 
    ------------------------------------------- 
    
    +0

    如果你想得到一支由18岁到25岁之间的男性和女性组成的队伍,那么'team_member_id' = 1应该不会出现在结果中。 – StackOverflowNewbie