2013-11-26 3 views
0

У меня есть следующие три таблицы (упрощенный вариант):SQL жесткий запрос: события между другими событиями

levelsloaded:

  • Идентификация (Int, первичный ключ, автоматический инкремент)
  • globalId (Int , ключ)
  • дата (Datetime, Key)
  • идентификатор_сервера (Int, Key)
  • gamemodeId (Int, Key)
  • МАПИД (Int, Key)

playerjoins:

  • идентификатор (Int, первичный ключ, автоматический инкремент)
  • globalId (Int, Key)
  • даты (DateTime, Key)
  • идентификатор_сервера (Int, Key)
  • playerId (Int, Key)

playerleaves:

  • идентификатор (Int, первичный ключ, автоматический инкремент)
  • globalId (Int, Key)
  • даты (DateTime, Key)
  • идентификатор_сервера (Int, Key)
  • playerId (Int, Key)

Я уже несколько часов думал об этом запросе, но я не могу понять это. Я хочу это: Выберите все строки из уровней, где уровень загружен в тот момент, когда игрок играл на сервере.

Я попытался уточнить «вопрос», но это сделало бы его неясным.

Пример картина здесь:

Example

Вы видите различные уровня загружены события:

  • Один на 16:22:57 желанной, как это произошло после того, как я присоединился к серверу (и до того, как я покинул сервер)
  • Те, что были на 15:51:29 и 15:37:10, не должны происходить, поскольку я не играл на сервере.

Я знаю, что этот запрос определенно возможно, однако я не думаю, что это тривиальный запрос.

Любая помощь по этому вопросу будет оценена по достоинству. Также очень ценятся предложения по его решению.

EDIT: Мне удалось уточнить запрос немного. Шаг FIrst для получения решения будет состоять в следующем: создать подзапрос, который получает, получает каждый уровень нагрузки между соединением игрока и выходом игрока, только как это получить? Рассмотрим следующую таблицу событий:

  • карта 1 грузы
  • игрок А присоединяется
  • карта 2 грузы
  • карта 3 нагрузки
  • игрок А листья
  • карта 4 нагружает
  • игрока A
  • map 5 грузы
  • карта 6 нагрузок
  • игрок А оставляет
  • карте 7 нагрузок
  • карта 8 нагрузок

Тогда только правильные результаты будут: карта 2, 3, 5 и 6. Так мне нужно чтобы выполнить итерацию по набору результатов и получить все карты, которые происходят между соединением игрока, и оставить следующего игрока, а затем перейти к следующей строке.

+0

Фотографии? Это не то, как мы катимся. И оружие - это не слово. – Strawberry

+0

@Strawberry Well Я думаю, что картина лучше, чем вообще нет картинки ... – skiwi

ответ

0

Вы не указали тип SQL аромата вы используете, но с использованием общего SQL я считаю, что-то близкое к:

SELECT * 
FROM levelsloaded ll, playerjoins pj, playerleaves pl 
WHERE ll.serverId = pj.serverId AND ll.serverId = pl.serverId AND 
     pj.playerId = $IDINQUESTION AND pl.playerId = $IDINQUESTION AND 
     ll.date >= pj.date AND ll.date < pl.date; 

Хотя я не могу вспомнить, если дата содержит метку времени.

+0

Fyi, я использую MySQL. Но для краски я не хотел, чтобы были выбраны «15: 51: 29» и «15: 37: 10». И могут быть игроки/листья до и после этой отметки времени, допустим, они могут встречаться в ' 00:00:00 'и '23: 59: 59' для простоты, тогда ваш запрос по-прежнему будет выбирать 'levelsloaded'? Хотя намерение состоит в том, чтобы не выбирать их. – skiwi

+0

Я не уверен, правильно ли я правильно понял вопрос, если вы хотите, чтобы он был точным обратным к тому, что я хотел, используйте это как подзапрос в предложении where. – Jash

+0

Если игрок присоединяется/листья игрока указывают, когда игрок находится на сервере. Выбранный оператор select, который я обнаружил, захватил бы все экземпляры загрузки, пока игрок, о котором идет речь, находится в сети. – Jash

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