2010-07-22 101 views
0

短数据库模式:帮助与SQL查询

  • 用户(ID)
  • 游戏(current_player_id)//有许多卡
  • 卡(AUTHOR_ID,game_id,内容,created_at)
  • game_views (game_id,USER_ID)//显示哪些游戏的用户所看到的

我需要找到游戏用户,这满足所有其规则:

  1. 游戏的current_player为NULL在比赛的最后一张牌的
  2. 作者(游戏中不被任何人现在扮演)(ORDER BY created_at,我认为)是不用户
  3. 比赛未曾出现过的用户

我使用PostgreSQL。

回答

0

我认为这是最明确的解决方案。有了合适的指数,表现应该是合理的,但如果游戏数量达到数百万,那么它的表现就不会很好。如果发生这种情况,提高性能的一种方法是将最后一个card_id存储在游戏级别。

select game_id 
FROM game g 
WHERE g.current_player is null 
AND not exists (select 0 from game_view gv 
      where gv.user_id = v_my_user_id and gv.game_id = g.game_id) 
AND not exists (select 0 from 
    (select author_id from cards c where c.game_id = g.game_id order 
    by created_at LIMIT 1) 
    t1 where t1.author_id = v_my_user_id) 
0

我正在用SQL Server编写这段代码,但它应该在Postgres中工作。如果没有,差异应该是最小的。

这个解决方案应该可以工作(我没有在这里安装Postgres),但是你可能想为大数据集优化它;使用索引,统计等...(通常)。

SELECT DISTINCT games.game_id FROM games INNER JOIN cards ON games.game_id = cards.game_id WHERE games.current_player_id is NULL and games.game_id in (SELECT DISTINCT game_id FROM GAME_VIEWS WHERE user_id != 666) and cards.author_id != 666 GROUP BY games.game_id ORDER BY cards.created_at DESC 

再次,交换“666”与实际的ID。 希望它有帮助!

+0

对不起,但我想你误解了我想要的。我想找到符合所有规则的游戏。 – yukas 2010-07-22 09:08:58

+0

啊,好的。让我编辑它。 – 2010-07-22 09:23:24