好吧我觉得我搞砸了某个地方,但也许有人可以发现我的错误,因为我对我正在做的事情一无所知。
我有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'
)
答案 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语句。你说它并没有像预期的那样发挥作用,但对我来说似乎是这样做的......最后一个看到活跃的玩家和最后一个看到每个地区空置的玩家。排序可能不会使它具有可读性,但确实如此。