2013-11-26 27 views
0

我有以下三個表(簡本):SQL很難查詢:其他事件之間的事件

levelsloaded:

  • ID(智力,主鍵,自動遞增)
  • globalId(智力,密鑰)
  • 日期(日期時間,密鑰)
  • SERVERID(智力,密鑰)
  • gamemodeId(智力,關鍵)
  • 的azazaz(智力,密鑰)

playerjoins:

  • ID(智力,主鍵,自動遞增)
  • globalId(智力,密鑰)
  • 日期(日期時間,密鑰)
  • SERVERID(智力,密鑰)
  • playerId(智力,密鑰)

playerleaves:

  • ID(智力,主鍵,自動遞增)
  • globalId(智力,密鑰)
  • 日期(日期時間,密鑰)
  • SERVERID(智力,關鍵)
  • playerId(Int,Key)

我已經想了幾個小時關於這個查詢已經,但我似乎無法弄清楚。我想要這個:從玩家在服務器上玩的時刻開始加載關卡時,選擇水平加載的所有行。

我試圖完善「問題」,但那會使它不清楚。

一個例子圖片瀏覽:

Example

你看到各種級別加載事件:

  • 16:22:57的一個希望,因爲它我加入了服務器後發生的(和在我離開服務器之前)
  • 15:51:2915:37:10應該不會發生,因爲我沒有在服務器上玩。

我知道這個查詢肯定可能,但我不認爲這是一個微不足道的查詢。

任何幫助,將不勝感激。另外建議來解決它我自己非常感謝。

編輯:我已經成功地細化查詢一點點。獲得解決方案的第一步是:創建一個子查詢,獲取玩家加入和玩家之間的每個級別加載離開,只有如何獲得?考慮事件下表:

  • 圖1個負載
  • 玩家A加入
  • 圖2個負荷
  • 圖3個負荷
  • 玩家A離開
  • 圖4個負載
  • 球員A加入
  • 圖5個負荷
  • 圖6級的負載
  • 玩家A離開
  • 地圖7個負載
  • 地圖8個負載

那麼唯一正確的結果將是:圖2,圖3,圖5和6,所以 我需要通過結果集遍歷並獲得所有在玩家加入和下一個玩家離開之間發生的地圖,然後跳轉到下一行。

+0

圖片?這不是我們滾動的方式。而武器不是一個詞。 – Strawberry

+0

@Strawberry嗯,我認爲一張圖片更好,因爲沒有圖片... – 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