2009-12-12 62 views
0

我不能在正確的軌道與此上得到的,任何幫助,將不勝感激MySQL的選擇問題

我有一個表

+---+----------+---------+-----------+ 
|id | match_id | team_id | player_id | 
+---+----------+---------+-----------+ 
| 1 |  9 |  10 |   5 | 
| 2 |  9 |  10 |   7 | 
| 3 |  9 |  10 |   9 | 
| 4 |  9 |  11 |  12 | 
| 5 |  9 |  11 |  15 | 
| 6 |  9 |  11 |  18 | 
+---+----------+---------+-----------+ 

我想在match_id一個地方選擇這些和這兩個團隊的ID,因此產量將

+---------+-------+------+---------+---------+ 
| MATCHID | TEAMA | TEAMB| PLAYERA | PLAYERB | 
+---------+-------+------+---------+---------+  
|  9 | 10 | 11 |  5 |  12 | 
|  9 | 10 | 11 |  7 |  15 | 
|  9 | 10 | 11 |  9 |  18 | 
+---------+-------+------+---------+---------+ 

它可能很簡單,但我卡住了..

在此先感謝

p.s.似乎忘了我的第一篇文章中的一列,對不起

+2

很抱歉,但不斷變化的需求無時無刻不使這個容易。在目前的版本中,如何知道哪些球員排在一起?如果兩支球隊的球員人數不一樣會怎麼樣? – 2009-12-12 11:46:27

+0

對不起。 數據準確無誤。 每場比賽各有3名球員 – michael 2009-12-12 13:29:13

+0

另外,如果結果是球員A(5)對球員B(18) – michael 2009-12-12 13:47:07

回答

1

我認爲你應該重新設計你的表格,也許你想要的輸出格式應該是你的表格設計。

與您的設計,它可能有三個或更多的球隊對陣對方...


所以。我又試了一次(自己來自Oracle,我真的很想念ROWNUM)。

以下查詢應該給你你想要的結果,但我不確定你是否應該在純SQL中真正做到這一點。也許你可以把你的客戶中的團隊結合起來?

SELECT m1.match_id, m1.team_id, m2.team_id, m1.player_id, m2.player_id 
FROM (
    SELECT match_id, team_id, player_id, 
    -- get ranking 
    (SELECT 1 + count(*) 
    FROM matches m1b 
    WHERE m1b.match_id = m1a.match_id 
    AND m1b.team_id = m1a.team_id 
    AND m1b.player_id < m1a.player_id) rank 
    FROM matches m1a 
    WHERE m1a.team_id = (SELECT MIN(team_id) -- first team 
         FROM matches 
         WHERE match_id = m1a.match_id) 
) m1, 
(
    SELECT match_id, team_id, player_id, 
    -- get ranking 
    (SELECT 1 + count(*) 
    FROM matches m2b 
    WHERE m2b.match_id = m2a.match_id 
    AND m2b.team_id = m2a.team_id 
    AND m2b.player_id < m2a.player_id) rank 
    FROM matches m2a 
    WHERE m2a.team_id = (SELECT MAX(team_id) -- second team 
         FROM matches 
         WHERE match_id = m2a.match_id) 
) m2 
WHERE m1.match_id = m2.match_id 
AND m1.rank = m2.rank 

我在這裏做的是:

  1. 選擇從團隊中的所有行與每場比賽較低TEAM_ID,給他們一個等級(1到每場比賽3)
  2. 選擇從所有行團隊每匹配更高TEAM_ID並給他們一個排名(1到每場3)
  3. 合併這兩個查詢中一個結果,其中,所述match_id和排名匹配
+0

+1重新設計表或期望的輸出結果無所謂:) – Li0liQ 2009-12-12 10:08:43

+0

不幸桌子重新設計不是一個選項 – michael 2009-12-12 10:50:25

0

匹配是mysql中的一個保留字。這裏使用的表名是配襯

select match_id, sum(if(id=1, team_id,0))team_A, sum(if(id=2,team_id,0)) team_b 
from matchs 
group by match_id; 
+----------+--------+--------+ 
| match_id | team_A | team_b | 
+----------+--------+--------+ 
|  5 |  9 |  10 | 
+----------+--------+--------+ 
1 row in set (0.00 sec) 
+0

id在開始時是未知的 – michael 2009-12-12 10:48:57

0

我不知道,如果以前的答案會給你你在找什麼,至少我把你的問題別人意味着什麼 - 也許你可以澄清的目的表和查詢。如果表關聯與比賽的球隊,您想查詢向您展示一個匹配相關聯的所有球隊,那麼你的查詢應該是

select team_id as teams from table where match_id = id_here 

這將使你回來(用於id_here爲5)

teams 
----- 
9 
10