选择加入2个表的语句,按日期和状态搜索

时间:2014-05-24 04:49:32

标签: mysql sql

好吧我觉得我搞砸了某个地方,但也许有人可以发现我的错误,因为我对我正在做的事情一无所知。

我有2个桌面玩家和RegionPlayer(参见底部的结构)

我试图在一段时间内没有看到某个区域的球员。玩家可以休假,然后只有8天。 如果在那段时间内没有看到某个区域的玩家,我希望sql搜索返回regionID,以及该区域中最近看到的人。

现在我认为这样做的方法是从每个地区获得2个结果,每个结果都为我提供了最近看过谁度假的人,以及没有休假的人。

但是,虽然我认为这会给我这个,但它似乎并没有。

SELECT RegionPlayer.Regionid, Players.key, Players.Name, Players.Seen, Players.Vacation 
FROM RegionPlayer 
JOIN Players 
ON Players.Key = RegionPlayer.Playerid 
where ( RegionPlayer.Status = 1 ) 
GROUP BY RegionPlayer.Regionid DESC, Players.Vacation DESC
ORDER BY  Players.Seen DESC 

然后我需要能够分辨出谁有一段时间没有被人看到,这应该给我这个。
现在我知道我可以将两个查询链接在一起,但我不知道自从我上次将这些努力付诸于sql语句以来已经很多年了。

Select Players.key FROM Players
WHERE
(( Players.Vacation != 1 ) AND  
( Players.Seen <= (NOW() - INTERVAL 8 DAY   ) ))
OR
(( Players.Vacation != 0 ) AND  
( Players.Seen <= (NOW() - INTERVAL 58 DAY   ) ))

有没有更好的方法来做到这一点,我记得像视图,存储过程和函数这样的东西,它们中的一个或多个会更好吗?

表格结构。 请原谅,表格的名称,一些结构,这是为什么在1/2瓶葡萄酒是一个坏主意后深夜决定的原因。

CREATE TABLE IF NOT EXISTS `Players` (
`key` int(11) NOT NULL,
  `Name` varchar(255) NOT NULL,
  `Vacation` varchar(1) NOT NULL,
  `Seen` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `Modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
)

CREATE TABLE IF NOT EXISTS `RegionPlayer` (
`Key` int(11) NOT NULL,
  `Playerid` int(11) NOT NULL,
  `Regionid` int(11) NOT NULL,
  `Type` varchar(1) NOT NULL,
  `Status` int(1) NOT NULL DEFAULT '1',
  `Modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `Created` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00'
)

2 个答案:

答案 0 :(得分:0)

试试这个

SELECT RegionPlayer.Regionid, m.key, m.Name, m.Seen, m.Vacation 
FROM RegionPlayer 
JOIN (Select * as key FROM Players
WHERE
(( Players.Vacation != 1 ) AND  
( Players.Seen <= (NOW() - INTERVAL 8 DAY   ) ))
OR
(( Players.Vacation != 0 ) AND  
( Players.Seen <= (NOW() - INTERVAL 58 DAY   ) ))) m
ON m.Key = RegionPlayer.Playerid 
where ( RegionPlayer.Status = 1 ) 
GROUP BY RegionPlayer.Regionid DESC, m.Vacation DESC
ORDER BY  m.Seen DESC 

答案 1 :(得分:0)

我已经提出SQLFiddle

回答您的基本要求的查询,似乎是:列出过去8天内没有看到活跃玩家的所有区域,并且在过去58天内没有看到腾出的玩家,还提供了上次看到的玩家的数据在该地区:

SELECT r.*
FROM (
  SELECT rp.Regionid, p.Key, p.Name, p.Vacation, p.Seen
  FROM RegionPlayer rp
  JOIN Players      p  ON p.Key = rp.Playerid 
  WHERE rp.Status = 1
  GROUP BY rp.Regionid
  ORDER BY p.Seen DESC
) r
WHERE ((r.Vacation != 1) AND (r.Seen <= (NOW()-INTERVAL  8 DAY)))
   OR ((r.Vacation != 0) AND (r.Seen <= (NOW()-INTERVAL 58 DAY)));

我从您的SQL中推测,只应考虑Status为1的RegionPlayer行。

在SQLFiddle上,我创建了一些具有不同组合的区域,这个查询可以完成它的工作。

关于你的第一个SQL语句。你说它并没有像预期的那样发挥作用,但对我来说似乎是这样做的......最后一个看到活跃的玩家和最后一个看到每个地区空置的玩家。排序可能不会使它具有可读性,但确实如此。