帮助一个可能嵌套的SQL查询

时间:2010-10-31 05:11:57

标签: sql mysql

我正在处理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')

现在我只有两个问题:

  1. sql为每个字段条目to返回多于1个条目,我想为每个to返回一条消息(LIM {1} to?)并且它必须是最新的(首先是id)。
  2. 为了使这个更清楚,我们假设我有一个这样的表:

    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"
    
    1. 我想在检索到的条目的同一SQL调用NOW()中更新字段shown

2 个答案:

答案 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]