MySQL根据某一列查询连接和分组

时间:2014-06-10 13:00:33

标签: php mysql

我有两张表如下:

  1. 小组

    team_id   team_name    group_id
    
    10001     team_one     50001
    10002     team_two     50001
    10003     team_three   50002
    10004     team_four    50002
    10005     team_five    50003
    10006     team_six     50003
    10007     team_seven   50004
    10008     team_eight   50004
    
  2. group_id  group_name
    
    50001     group_one
    50002     group_two
    50003     group_three
    50004     group_four
    
  3. 我想实现一个sql选择,根据以下组对团队进行分组:

    group_one
    team_one
    team_two
    
    group_two
    team_three
    team_four
    
    group_three
    team_five
    team_six
    
    group_four
    team_seven
    team_eight
    

    到目前为止,我已经完成了以下工作:

    SELECT 
      teams.team_name, 
      teams.soft_name,
      teams.group_id, 
      groups.group_id, 
      groups.group_name 
    FROM $table_name 
    INNER JOIN groups ON teams.group_id = groups.group_id 
    GROUP BY teams.group_id
    

    问题是,上面的查询只显示每组的前四个团队。即team_one,team_three,team_five,team_seven。 如何更改它以达到我想要的效果?

4 个答案:

答案 0 :(得分:1)

解决方案相当简单 - 我不确定为什么@MKhalidJunaid会说它不推荐:

在多个列上使用GROUP BY,如下所示:

SELECT 
  teams.team_name, 
  teams.soft_name,
  teams.group_id, 
  groups.group_id, 
  groups.group_name 
FROM $table_name 
INNER JOIN groups ON teams.group_id = groups.group_id 
GROUP BY teams.group_id, teams.team_id

有关完整说明,请参阅This Answer

答案 1 :(得分:0)

我假设您宁愿使用ORDER BY,而不是GROUP By:

  SELECT teams.team_name, teams.soft_name,teams.group_id, groups.group_id, groups.group_name FROM $table_name INNER JOIN groups ON teams.group_id = groups.group_id ORDER BY teams.group_id

答案 2 :(得分:0)

在mysql列中,结果中的名称必须是唯一的,否则MYSQL会选择其中一个并呈​​现它。

SELECT teams.team_name, teams.soft_name,teams.group_id as Team_Group_ID, 
  groups.group_id as Group_group_ID, groups.group_name 
FROM $table_name 
INNER JOIN groups 
  ON teams.group_id = groups.group_id 

这就是您丢失数据的原因: http://dev.mysql.com/doc/refman/5.0/en/group-by-extensions.html

简单地说,必须谨慎使用mySQL组的扩展名。您必须按返回的所有列进行分组,这将导致唯一的行,或者您可以让服务器“自由选择每个组中的任何值”

... MySQL扩展了GROUP BY的使用,因此选择列表可以引用GROUP BY子句中未命名的非聚合列。这意味着前面的查询在MySQL中是合法的。您可以通过避免不必要的列排序和分组来使用此功能来获得更好的性能。但是,当GROUP BY中未命名的每个非聚合列中的所有值对于每个组都相同时,这非常有用。服务器可以自由选择每个组中的任何值,因此除非它们相同,否则所选的值是不确定的。 ...

答案 3 :(得分:0)

如果您不介意在结果中添加一些额外数据,可以使用:

SELECT gr.group_name, gr.group_id, t.team_name, t.team_id FROM teams t
LEFT JOIN groups gr ON gr.group_id = t.group_id 
ORDER BY gr.group_id, t.team_id

结果如下:

group_name  group_id team_name      team_id   
group_one   50001    team_one   10001
group_one   50001    team_two   10002
group_two   50002    team_three 10003
group_two   50002    team_four  10004
group_three 50003    team_five  10005
group_three 50003    team_six   10006
group_four  50004    team_seven 10007
group_four  50004    team_eight 10008

据我所知,它基本上把你的整个桌子放在那里......但它有所有的团队蚂蚁他们的团队。您可以使用“where”来过滤您的组..或者运行查询,一组用于组,然后用于每组中的一组。