2010-07-22 111 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