关于可能嵌套的sql查询的帮助

关于可能嵌套的sql查询的帮助,sql,mysql,Sql,Mysql,我正在处理sql,我的sql不如我的ruby好,所以我希望你能帮助我 我有一张看起来像这样的da表: messages: id INTEGER PRIMARY KEY AUTO_INCREMENT to VARCHAR(255) text text shown DATETIME id, to, text 1, "x", "text1" 2, "x", "text2" 3, "y", "text3" 4, "z", "text4" 5, "y", "text5" 6, "z", "

我正在处理sql,我的sql不如我的ruby好,所以我希望你能帮助我

我有一张看起来像这样的da表:

messages:
id INTEGER PRIMARY KEY AUTO_INCREMENT
to VARCHAR(255)
text text
shown DATETIME
id, to,  text
1,  "x", "text1"
2,  "x", "text2"
3,  "y", "text3"
4,  "z", "text4"
5,  "y", "text5"
6,  "z", "text6"
7,  "y", "text7"
现在,我的脚本根据在线玩家的数量生成这个部分

"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')
现在我只有两个问题:

  • sql为每个字段项
    to
    返回一个以上的条目,我想为每个
    to
    返回一条消息(限制为
    to
    ?)并且它必须是最新的(首先是id)
  • 为了更清楚地说明这一点,我们假设我有这样一张表:

    messages:
    id INTEGER PRIMARY KEY AUTO_INCREMENT
    to VARCHAR(255)
    text text
    shown DATETIME
    
    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"
    
  • 我想为检索到的条目更新同一SQL调用NOW()中显示的字段
    关于第1点 表中没有字段“uniqueid”。我想你是说“id”(你的主键)?如果是这种情况,您需要更新where子句(将uniqueid更改为id),或者只需编辑您的帖子,这样我们就知道还有一个额外的字段

    假设您有一个名为“id”的字段,而uniqueid是一个输入错误(也可以用字符串替换%s)

    将为您提供每个id的未读邮件数

    关于第2点:不能在同一个查询中运行更新和选择。您将需要进行两个单独的SQL调用

    update messages 
    set shown = Now() 
    where [some where clause here]
    
    编辑-

    您可以使用此查询-

    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 
    
    当按[to]分组时,Am假设最新的按id作为id的最小值。否则,您可以使用max([id])

    这将产生-

    1,  "x", "text1"
    3,  "y", "text3"
    4,  "z", "text4"
    
    并且,您可以使用相同的查询来获取[Showed]列必须使用当前日期时间更新的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
    )
    

    uniqueid在表中的什么位置?“to”对于列来说是一个非常糟糕的名称。它在MYSQL中是一个保留字,所以每次引用它时,都需要用表前缀转义或标识它。很可能你或其他人偶尔会忘记做这件事,然后这会让你烦恼。也许像收件人这样的人会是更好的选择?查看此处了解更多详细信息:用
    转义到
    ,我不在乎,我想要一个真正的解决方案,而不是一些关于约定的唠叨。我已经重新编辑了这篇文章,你的假设是不正确的。哦,好的。。我将根据您更新的问题很快编辑我的答案。太棒了,我真的应该仔细阅读这些简单的sql技术。以前从未遇到过这样的事情。谢谢,伙计,一旦我获得了投票权,我会把它投平。该死,我注意到我只想要([to]=“x”和[to]=“y”),你能把它作为后续的代码块展示吗?我真的不太擅长sql…您可以简单地将where子句添加到同一个查询中。尝试在('x','y')中添加-WHERE[to],第二个sql让我头疼,是test1=消息吗?