2012-01-10 4 views
1

У меня есть простая база данных, которая отслеживает транзакции от нескольких игроков в игре.MySQL: нужно получить все записи, но игнорировать старые записи

Когда игра начинается между двумя игроками, уникальный game_id генерируется и хранится в отдельной базе данных под названием game_ids. В базе данных я запрашивая (game_transactions) мне нужно следующее случиться ...

Таблица game_transactions выборка данных:

game_id | home_id | visiting_id | timestamp | ... 
    3   1   2  00000001 
    4   1   3  00000001 
    3   2   1  00000002 
    3   1   2  00000003 
    4   1   3  00000002 
    3   2   1  00000004 
    4   1   3  00000003 

Как вы можете видеть, когда один игрок завершает свою очередь их игра добавляется в эту таблицу. Это продолжается до завершения игры. То, что я пытаюсь сделать, это получить все строки при поиске по user_id «WHERE home_id = user_id OR visit_id = user_id». Однако это возвращает ВСЕ строки для этого конкретного пользователя, я хочу ограничить запрос, чтобы предоставить строку данных для MOST RECENT game_id данными timestamp. timestamp - это фактическая отметка времени UNIX, но, к примеру, это более читаемо.

Когда сказано и сделано, этот запрос должен возвращать следующее при user_id = 1:

game_id | home_id | visiting_id | timestamp | ... 
    3   2   1  00000004 
    4   1   3  00000003 

Пожалуйста, дайте мне знать, если мне нужно уточнить дальше.

спасибо.

На боковой ноте я буду очищать базу данных записей старше x дней. Но это будет cron, который работает один раз в день, пытаясь свести запросы к минимуму!

+0

Используйте Ограничить слова и заказ по статье [источник] (http://bytes.com/topic/mysql/answers/440150-select-one-row-mysql-table) – hrezs

ответ

2
SELECT gt.game_id, gt.home_id, gt.visiting_id, gt.timestamp 
    FROM game_transactions gt 
     INNER JOIN (SELECT game_id, MAX(timestamp) AS MaxTimestamp 
         FROM game_transactions 
         WHERE 1 IN (home_id, visiting_id) 
         GROUP BY game_id) q 
      ON gt.game_id = q.game_id 
       AND gt.timestamp = q.MaxTimestamp 
+0

вверх и Бег! Только провел десять минут тестирования, но из того, что я могу сказать, это ТОЧНО, что мне нужно! Большое вам спасибо за пунктуальность и отформатированный ответ! – BajaBob

Смежные вопросы