0

PostgreSQL 8.4.13 には、カード ゲーム (それぞれに 3 人のプレイヤーがいる) とそれらのゲームのスコア結果を表す 2 つのテーブルがあります。プレーヤーはid列で識別され、ゲームは次のように識別されgidます。

# \d pref_games
                                    Table "public.pref_games"
 Column |            Type             |                        Modifiers
--------+-----------------------------+----------------------------------------------------------
 gid    | integer                     | not null default nextval('pref_games_gid_seq'::regclass)
 rounds | integer                     | not null
 stamp  | timestamp without time zone | default now()
Indexes:
    "pref_games_pkey" PRIMARY KEY, btree (gid)
Referenced by:
    TABLE "pref_scores" CONSTRAINT "pref_scores_gid_fkey" FOREIGN KEY (gid) REFERENCES pref_games(gid) ON DELETE CASCADE

# \d pref_scores
         Table "public.pref_scores"
 Column  |         Type          | Modifiers
---------+-----------------------+-----------
 id      | character varying(32) | not null
 gid     | integer               | not null
 money   | integer               | not null
 last_ip | inet                  |
 quit    | boolean               |
Indexes:
    "pref_scores_pkey" PRIMARY KEY, btree (id, gid)
    "pref_scores_gid_index" btree (gid)
Foreign-key constraints:
    "pref_scores_gid_fkey" FOREIGN KEY (gid) REFERENCES pref_games(gid) ON DELETE CASCADE
    "pref_scores_id_fkey" FOREIGN KEY (id) REFERENCES pref_users(id) ON DELETE CASCADE

id='OK261593357402'を持つプレーヤーがそのプレーヤーと一緒にプレイしたことがあるかどうかを調べようとしていますid='MR3689735717800138910'。これにより、Web サイトで相互に評価できるようになります。

私は電話をかける必要があると思いますperform true-inner joinこれは正しいですか?

だから私はしようとしています:

# select * from pref_games g inner join pref_scores s on (s.gid=g.gid) where s.id='OK261593357402';
   gid   | rounds |           stamp            |       id       |   gid   | money |    last_ip     | quit
---------+--------+----------------------------+----------------+---------+-------+----------------+------
 2124241 |     20 | 2013-05-01 12:26:54.052086 | OK261593357402 | 2124241 |    28 | 93.232.91.105  | f
 2125575 |     17 | 2013-05-01 16:53:21.090822 | OK261593357402 | 2125575 |    32 | 93.232.91.105  | f
 2125881 |     20 | 2013-05-01 17:47:26.15633  | OK261593357402 | 2125881 |   -31 | 93.232.91.105  | f
 2126242 |      0 | 2013-05-01 18:41:06.769132 | OK261593357402 | 2126242 |     0 | 93.232.91.105  | f
 2126244 |      0 | 2013-05-01 18:41:12.495192 | OK261593357402 | 2126244 |     0 | 93.232.91.105  | t
 2126259 |      0 | 2013-05-01 18:42:39.974518 | OK261593357402 | 2126259 |     0 | 93.232.91.105  | t
 2126613 |     33 | 2013-05-01 19:27:11.88462  | OK261593357402 | 2126613 |  -132 | 93.232.91.105  | f
 2126813 |      0 | 2013-05-01 19:57:05.23061  | OK261593357402 | 2126813 |     0 | 93.232.91.105  | t
 2127299 |     20 | 2013-05-01 20:36:42.021133 | OK261593357402 | 2127299 |   136 | 93.232.91.105  | f
 2127821 |      0 | 2013-05-01 21:33:32.168757 | OK261593357402 | 2127821 |     0 | 93.232.91.105  | f
 2127830 |      0 | 2013-05-01 21:34:47.694645 | OK261593357402 | 2127830 |     0 | 93.232.91.105  | t
 2128012 |     21 | 2013-05-01 22:04:03.850061 | OK261593357402 | 2128012 |    55 | 93.232.91.105  | f
 2129551 |     13 | 2013-05-02 10:08:37.348426 | OK261593357402 | 2129551 |   -32 | 79.250.39.175  | f
 2129818 |     13 | 2013-05-02 11:21:50.998484 | OK261593357402 | 2129818 |    71 | 79.250.39.175  | f
 2130467 |     11 | 2013-05-02 13:55:00.034698 | OK261593357402 | 2130467 |   -79 | 79.250.39.175  | f
 2130470 |      0 | 2013-05-02 13:55:41.298932 | OK261593357402 | 2130470 |     0 | 79.250.39.175  | f
 2130476 |      0 | 2013-05-02 13:56:22.359713 | OK261593357402 | 2130476 |     0 | 79.250.39.175  | f
.....

しかし、私はid='OK261593357402'上記のものしか見ません。つまり、彼のすべてのゲーム パートナーも見られると思っていましたが、配信されていません。

私も試しました:

# select * from pref_games g left outer join pref_scores s on (s.gid=g.gid) where s.id='OK261593357402';
   gid   | rounds |           stamp            |       id       |   gid   | money |    last_ip     | quit
---------+--------+----------------------------+----------------+---------+-------+----------------+------
 2124241 |     20 | 2013-05-01 12:26:54.052086 | OK261593357402 | 2124241 |    28 | 93.232.91.105  | f
 2125575 |     17 | 2013-05-01 16:53:21.090822 | OK261593357402 | 2125575 |    32 | 93.232.91.105  | f
 2125881 |     20 | 2013-05-01 17:47:26.15633  | OK261593357402 | 2125881 |   -31 | 93.232.91.105  | f
 2126242 |      0 | 2013-05-01 18:41:06.769132 | OK261593357402 | 2126242 |     0 | 93.232.91.105  | f
 2126244 |      0 | 2013-05-01 18:41:12.495192 | OK261593357402 | 2126244 |     0 | 93.232.91.105  | t
 2126259 |      0 | 2013-05-01 18:42:39.974518 | OK261593357402 | 2126259 |     0 | 93.232.91.105  | t
 2126613 |     33 | 2013-05-01 19:27:11.88462  | OK261593357402 | 2126613 |  -132 | 93.232.91.105  | f
 2126813 |      0 | 2013-05-01 19:57:05.23061  | OK261593357402 | 2126813 |     0 | 93.232.91.105  | t
...

残念ながら同じ結果…

代わりに一連のselects を組み合わせて作成する必要がありexists inますか?

4

2 に答える 2

1
select pg.*, ps.id, ps2.id
from
    pref_games pg
    inner join
    pref_scores ps on pg.gid = ps.gid
    inner join
    pref_scores ps2 on ps.gid = ps2.gid
where
    ps.id = 'OK261593357402'
    and ps2.id != 'OK261593357402'
于 2013-05-04T10:41:43.680 に答える