我正在处理sql并且我的sql不如我的ruby好,所以我希望你能帮助我。
我的da表看起来像这样:
messages:
id INTEGER PRIMARY KEY AUTO_INCREMENT
to VARCHAR(255)
text text
shown DATETIME
现在我的脚本会根据在线玩家的数量生成此部分。
"to = 'STEAM_0:0:xxx' OR to = 'STEAM_0:0:xxy' OR to = 'STEAM_0:0:xxz'"
这是一个活跃玩家的倾听,我想查看他们有一些未读消息的天气。现在有了这个字符串,我可以做一个sprintf:
SELECT * FROM messages WHERE shown IS NULL AND (%s)"
并获得一个很好的格式化字符串:
SELECT * FROM messages WHERE shown IS NULL AND (to = 'STEAM_0:0:xxx' OR to = 'STEAM_0:0:xxy' OR to = 'STEAM_0:0:xxz')
现在我只有两个问题:
to
返回多于1个条目,我想为每个to
返回一条消息(LIM {1} to
?)并且它必须是最新的(首先是id)。为了使这个更清楚,我们假设我有一个这样的表:
id, to, text
1, "x", "text1"
2, "x", "text2"
3, "y", "text3"
4, "z", "text4"
5, "y", "text5"
6, "z", "text6"
7, "y", "text7"
我想得到以下内容:
1, "x", "text1"
3, "y", "text3"
4, "z", "text4"
shown
。 答案 0 :(得分:1)
编辑 -
您可以使用此查询 -
Select T1.[id],T1.[to],T1.[text] from Messages T1
inner join
( Select [to], min([id]) as id from Messages group by [to] ) T2
on T1.[id] = T2.id
我假设最新的id作为id的最小值,而按[to]分组。否则,您可以使用max([id])
这会产生 -
1, "x", "text1"
3, "y", "text3"
4, "z", "text4"
并且,您可以使用相同的查询来获取[显示]列必须使用当前日期时间更新的ID -
UPDATE messages SET shown = Now()
where [id] in
(
Select T1.[id] from messages T1
inner join
( Select [to], min([id]) as id from messages group by [to]) T2
on T1.[id] = T2.id
)
答案 1 :(得分:0)
关于第1点 您的表中没有字段“uniqueid”。我假设你的意思是“id”(你的主键)?如果是这种情况,你需要更新where子句(将uniqueid更改为id)或者除了编辑你的帖子之外什么也不做,所以我们知道还有一个额外的字段。
假设你有一个名为'id'的字段,而且uniqueid是一个拼写错误(也用你的字符串替换%s)
select count(*), id
from messages
where shown is null and (%s)
group by id
将为您提供每个ID
的未读消息计数关于第2点:您无法在同一查询中运行更新和选择。您需要进行两次单独的SQL调用。
update messages
set shown = Now()
where [some where clause here]