2017-02-26 3 views
1
CREATE TABLE users (
    users_id MEDIUMINT UNSIGNED NOT NULL AUTO_INCREMENT, 
    first_name VARCHAR(20) NOT NULL, 
    last_name VARCHAR(40) NOT NULL, 
    email VARCHAR(60) NOT NULL, 
    password CHAR(40) NOT NULL, 
    PRIMARY KEY (users_id) 
); 

CREATE TABLE games (
    games_id MEDIUMINT UNSIGNED NOT NULL AUTO_INCREMENT, 
    locations_id MEDIUMINT UNSIGNED NOT NULL 
    PRIMARY KEY (games_id) 
); 

CREATE TABLE games_users (
    users_id MEDIUMINT UNSIGNED NOT NULL, 
    games_id MEDIUMINT UNSIGNED NOT NULL, 
    score MEDIUMINT UNSIGNED NOT NULL, 
    created DATETIME NOT NULL, 
    last_updated DATETIME NOT NULL, 
    PRIMARY KEY (games_id, users_id) 
); 

は、各ゲームは2人のユーザ間で取得し、games_usersは、各ゲームの2行、各プレイヤーのための1つを持っているので、勝者は最高のスコアを持っています(はい、そうです!)。最小値と最大値の列のためのプラスのすべての行データ上記の表では

ゲームごとに1つの行が必要な場合は、勝ち負けのスコアを得ることができます(下記のクエリを使用してください)が、勝者と敗者のIDも知る必要があります。

SELECT 
    *, 
    min(score) as loser, 
    max(score) as winner 
FROM games 
LEFT JOIN 
    games_members 
ON 
    games_members.games_id = games.games_id 
GROUP BY 
    games_members.games_id 

答えて

1

自己結合を使用できます。
描画の可能な場合は、列の名前をより良い方法で選択できます。

select 
    gu1.games_id, 
    winner.users_id 'id of the winner', 
    gu1.score 'score of the winner', 
    looser.users_id 'id of the looser' 
    gu2.score 'score of the looser' 
from games_users gu1 
join games_users gu2 on gu1.games_id = gu2.games_id 
join users winner on gu1.users_id = winner.users_is 
join users looser on gu2.users_id = looser.users_is 
where 1=1 
and gu1.score >= gu2.score 
and gu1.users_id != gu2.users_id 
group by gu1.games_id 
関連する問題