帮助SQL查询

时间:2010-07-22 08:50:50

标签: sql ruby-on-rails postgresql

短数据库架构:

  • 用户(id)
  • games(current_player_id)//有很多卡
  • cards(author_id,game_id,content,created_at)
  • game_views(game_id,user_id)//显示用户看过哪些游戏

我需要为用户找到符合所有规则的游戏:

  1. 游戏的current_player为NULL(游戏现在没有人播放)
  2. 游戏中最后一张卡片的作者(我认为按创建者编号排序)不是用户
  3. 用户 尚未看到
  4. 游戏

    我使用PostgreSQL。

2 个答案:

答案 0 :(得分: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交换。 希望它有所帮助!

答案 1 :(得分: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)