簡體   English   中英

MySQL查詢根據特定列進行聯接和分組

[英]MySQL query join and group according to a certain column

我有兩個表,如下所示:

  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 

我想實現一個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。 如何更改它以達到期望的結果?

解決方案非常簡單-我不確定為什么@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

有關完整說明,請參見此答案

我假設您寧願使用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

在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中命名的所有值對於每個組都相同時才有用。 服務器可以從每個組中自由選擇任何值,因此,除非它們相同,否則選擇的值是不確定的。 ...

如果您不介意結果中有多余的數據,可以使用以下方法:

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”過濾您的組。。或者運行查詢,一個查詢組,然后查詢其中的每個團隊。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM