Good morning, there are these 2 records in a table:

# select m.played, m.mid, m.action, m.gid, m.uid from words_moves m where
gid=10;
            played             | mid | action | gid | uid
-------------------------------+-----+--------+-----+-----
 2018-02-19 14:42:08.46222+01  |  12 | play   |  10 |   9
 2018-02-20 15:06:01.430634+01 | 216 | expire |  10 |  11
(2 rows)

I try to get the record with the latest timestamp by adding a NOT EXISTS
condition -

# select m.played, m.mid, m.action, m.gid, m.uid from words_moves m where
gid=10 and not exists (select 1 from words_moves x where m.mid=x.mid AND
x.played > m.played);
            played             | mid | action | gid | uid
-------------------------------+-----+--------+-----+-----
 2018-02-19 14:42:08.46222+01  |  12 | play   |  10 |   9
 2018-02-20 15:06:01.430634+01 | 216 | expire |  10 |  11
(2 rows)

Why are still 2 records returned? I am probably overlooking something
simple, sorry...

Thank you
Alex

P.S. In case more details are needed -

# explain select m.played, m.mid, m.action, m.gid, m.uid from words_moves m
where gid=10 and not exists ( select 1 from words_moves x where m.mid=x.mid
AND x.played > m.played);
                                         QUERY PLAN
---------------------------------------------------------------------------------------------
 Nested Loop Anti Join  (cost=0.28..43.78 rows=1 width=29)
   ->  Seq Scan on words_moves m  (cost=0.00..27.18 rows=2 width=29)
         Filter: (gid = 10)
   ->  Index Scan using words_moves_pkey on words_moves x  (cost=0.28..8.29
rows=1 width=16)
         Index Cond: (m.mid = mid)
         Filter: (played > m.played)
(6 rows)

# \d words_moves
                                     Table "public.words_moves"
 Column |           Type           | Collation | Nullable |
Default
--------+--------------------------+-----------+----------+------------------------------------------
 mid    | bigint                   |           | not null |
nextval('words_moves_mid_seq'::regclass)
 action | text                     |           | not null |
 gid    | integer                  |           | not null |
 uid    | integer                  |           | not null |
 played | timestamp with time zone |           | not null |
 tiles  | jsonb                    |           |          |
 score  | integer                  |           |          |
Indexes:
    "words_moves_pkey" PRIMARY KEY, btree (mid)
Check constraints:
    "words_moves_score_check" CHECK (score >= 0)
Foreign-key constraints:
    "words_moves_gid_fkey" FOREIGN KEY (gid) REFERENCES words_games(gid) ON
DELETE CASCADE
    "words_moves_uid_fkey" FOREIGN KEY (uid) REFERENCES words_users(uid) ON
DELETE CASCADE
Referenced by:
    TABLE "words_daily" CONSTRAINT "words_daily_mid_fkey" FOREIGN KEY (mid)
REFERENCES words_moves(mid) ON DELETE CASCADE
    TABLE "words_scores" CONSTRAINT "words_scores_mid_fkey" FOREIGN KEY
(mid) REFERENCES words_moves(mid) ON DELETE CASCADE

Reply via email to