2,3,4人のプレイヤーでプレイできるゲームがあるとします。私は自分のデータベース(MySQL 5.1)でこのようなゲームを以下の3つのテーブルで追跡します。私は、フィールドは自明であることを期待しています:同じテーブルを複数回左に結合する
create table users (id int, login char(8));
create table games (id int, stime datetime, etime datetime);
create table users_games (uid int, gid int, score int);
[ゲームテーブルで追跡2回は開始時刻と終了時刻です]ここ
が表に移入するためにいくつかのダミーデータである。
insert into games values
(1, '2011-12-01 10:00:00', '2011-12-01 13:00:00'),
(2, '2011-12-02 11:00:00', '2011-12-01 14:00:00'),
(3, '2011-12-03 12:00:00', '2011-12-01 15:00:00'),
(4, '2011-12-04 13:00:00', '2011-12-01 16:00:00');
insert into users_games values
(101, 1, 10),
(102, 1, 11),
(101, 2, 12),
(103, 2, 13),
(104, 2, 14),
(102, 3, 15),
(103, 3, 16),
(104, 3, 17),
(105, 3, 18),
(102, 4, 19),
(104, 4, 20),
(105, 4, 21);
は今、私は次の形式でレポートを生成する必要があります。
あるgid p1 p2 p3 p4 started ended
1 101 102 [g1] [g1]
2 101 103 104 [g2] [g2]
3 102 103 104 105 [g3] [g3]
4 102 104 105 [g4] [g4]
、同じ行のゲームをプレイしたすべてのプレイヤーを示すレポート。私はまた、ユーザーテーブルから自分のスコアや他のいくつかの情報が必要ですが、それは私がこれを始め
:-)フェーズ2である:
select g.id, g.stime, g.etime, ug1.uid, ug2.uid, ug3.uid, ug4.uid
from games g, users_games ug1, users_games ug2, users_games ug3, users_games ug4
where
g.id = ug1.gid and
ug1.gid = ug2.gid and
ug1.uid < ug2.uid and
ug2.gid = ug3.gid and
ug2.uid < ug3.uid and
ug3.gid = ug4.gid and
ug3.uid < ug4.uid
これは私にすべての4つの座席が占有されたすべてのゲームを提供します(すなわち、上記ダミーデータ中のゲームID3のみ)。しかし、それは私が必要とするデータの部分集合に過ぎません。これは私に上記のダミーデータと14行を与える
select g.id, g.stime, g.etime, ug1.uid, ug2.uid,
ifnull(ug3.uid, ''), ifnull(ug4.uid, '')
from (games g, users_games ug1, users_games ug2)
left join users_games ug3 on ug2.gid = ug3.gid and ug2.uid < ug3.uid
left join users_games ug4 on ug3.gid = ug4.gid and ug3.uid < ug4.uid
where
g.id = ug1.gid and
ug1.gid = ug2.gid and
ug1.uid < ug2.uid
:
これは私の第二の試みです。
select g.id, g.stime, g.etime, ug1.uid, ug2.uid,
ifnull(ug3.uid, ''), ifnull(ug4.uid, '')
from
(games g, users_games ug1, users_games ug2,
(select gid as g, min(uid) as u from users_games group by g) as xx
)
left join users_games ug3 on ug2.gid = ug3.gid and ug2.uid < ug3.uid
left join users_games ug4 on ug3.gid = ug4.gid and ug3.uid < ug4.uid
where
g.id = xx.g and
ug1.uid = xx.u and
g.id = ug1.gid and
ug1.gid = ug2.gid and
ug1.uid < ug2.uid
は、今私がダウンして9行にしていますが、私はまだスプリアス多くのデータを持っている:私は最低UIDのプレーヤーのためのエントリにUG1を固定することで、エラーの一つのソースを排除しようとしました。私は問題を見ることができます。たとえば、ゲーム3では、ug1がユーザー102に固定されていて、まだug2をアンカーできるプレイヤーは3人います。等々。しかし、私はこの難解を解決する方法を見つけることができません - どのように私は最終的に正しい順序と数で選手と4行を出力するクエリを達成することができますか?
これは、私には他の状況で解決された問題である必要があります。ここですべての助けを感謝します。
は、私は強くあなたをアドバイスします* ''と '' JOIN'の構文を混ぜてはいけません。ちょうど 'JOIN'を使って、それは20年古いですね... – MatBailie