2010-07-22 2 views
0

Короткая схема базы данных:Помощи с SQL запросом

  • пользователей (ID)
  • игр (current_player_id) // имеет много карт
  • карт (author_id, game_id, содержание, created_at)
  • game_views (game_id, user_id) // показывает, какие игры пользователь видел

Мне нужно найти игру для пользователя, который отвечает всем, чьи правила: current_player

  1. игры является NULL (игра не играет никто прямо сейчас)
  2. автор последней карты в игре (порядка по 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» на фактический идентификатор. Надеюсь, это поможет!

+0

Извините, но я думаю, вы неправильно поняли, что я хочу. Я хочу найти игры, которые отвечают всем правилам сразу. – yukas

+0

А, ок. Лемм редактирует это. –