2016-08-28 7 views
0

私は、参加者のテーブルを持っています。各エントリにはプレーヤー、チーム、日付フィールドがあります。私はすべての選手とそれに対応するチームのリストを作りたいので、私はSQL GROUP BY日付が最も高い行を選択してください

SELECT player, COUNT(DISTINCT matchid) matches, team FROM participants GROUP BY player 

プレイヤーがチームを切り替える場合は、それがそのプレイヤーのためにランダムな(?)チームが返されますような何かを。最高のdateフィールドに対応するエントリを選択させる方法はありますか(現在のチームを返します)?私は(SELECT * FROM participants ORDER BY date DESC) xparticipantsを置き換えようとしましたが、何も影響を及ぼさないようです。

これまで考えていたのは、MID(MAX(CONCAT(date, '_', team)),12)を使用していましたが、dateは常に10桁の数字である場合があります。


ここ一致が次に1234567890にチームA(ボブとジョンからなる)とBチーム(ジェームズとロスからなる)との間に再生されたことを示す例示的なデータ

MATCHID  PLAYER    TEAM    DATE 
1    Bob     Team A    1234567890 
1    John     Team A    1234567890 
1    James    Team B    1234567890 
1    Ross     Team B    1234567890 
2    James    Team A    1234567891 
2    John     Team A    1234567891 
2    Bob     Team B    1234567891 
2    Ross     Team B    1234567891 

ですボブとジェームスはチームを切り替え、後日別の試合をした。私はしかし、ボブ・ジェームスのエントリが正しいチームを表示することを保証する方法はないように思わ以下

PLAYER    TEAM    MATCHES 
Bob     Team B    2 
John     Team A    2 
James    Team A    2 
Ross     Team B    2 

のようなデータを受信したいと思います。

+0

サンプルデータと期待される結果を表示してください – TheGameiswar

+0

投稿にテーブルを含めることはできませんか? – riv

+0

質問を改善する方法については、このリンクをクリックしてください.https://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/ – TheGameiswar

答えて

0

は、ここに1つのソリューションです:私はちょうどdate DESCが注文した最初のチームを選択しcorelatedサブクエリ、とteam列を置き換えます。

SELECT player, COUNT(DISTINCT matchid) matches, (
    SELECT team 
    FROM participants p2 
    WHERE p2.player = p1.player 
    ORDER BY `date` DESC 
    LIMIT 1 
) as team 
FROM participants p1 
GROUP BY player 
ORDER BY team, player;; 

MAX(DATE)で結合を持つ別の解決策:

MAX(CONCAT())を使用して
SELECT plr.player, plr.matches, prt.team 
FROM (
    SELECT player, COUNT(DISTINCT matchid) matches, MAX(`date`) as last_played 
    FROM participants 
    GROUP BY player 
) plr 
JOIN participants prt 
    ON prt.player = plr.player 
    AND prt.`date` = plr.last_played 
ORDER BY prt.team, plr.player; 

SELECT player, COUNT(DISTINCT matchid) matches, 
    SUBSTR(MAX(CONCAT(LPAD(`DATE`, 10, 0), team)), 11) as team 
FROM participants p1 
GROUP BY player 
ORDER BY team, player; 

http://sqlfiddle.com/#!9/98f2f5/16

0

あなたが最初の抽出ができチームのうちgroup_concat

SELECT player, 
     COUNT(DISTINCT matchid) matches, 
     SUBSTRING_INDEX(GROUP_CONCAT(team ORDER BY date DESC SEPARATOR ','),',',1) team 
FROM  participants 
GROUP BY player 

SQL fiddleを参照してください。

関連する問題