sql
  • mysql
  • 2010-10-31 72 views 2 likes 
    2

    我正在处理SQL和我的SQL不如我的红宝石,所以我希望你能帮助我。帮助一个可能嵌套的SQL查询

    我有大的表看起来像这样:

    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回报每个字段条目多于1个条目to,我想每to(限制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" 
    
    1. 我想更新的领域shown与NOW()对检索的条目进行同样的SQL调用。
    +0

    where uniqueid is in the table? – Dani 2010-10-31 05:21:17

    +0

    'to'对于列来说是一个非常糟糕的名字。它是MYSQL中的一个保留字,因此每次引用时都需要使用表前缀进行转义或标识。很可能你或其他人偶尔会忘记这样做,然后它会激怒你。也许像收件人一样会是更好的选择?在这里看到更多的细节:http://dev.mysql.com/doc/refman/5.1/en/reserved-words.html – 2010-10-31 07:09:57

    +0

    转义与'to',我不在乎,我想要一个真正的解决方案,而不是一些关于公约的唠叨。 – 2010-10-31 07:26:03

    回答

    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的最小值,同时通过分组[来]。否则,你可以使用MAX([ID])

    这将产生 -

    1, "x", "text1" 
    3, "y", "text3" 
    4, "z", "text4" 
    

    而且,你可以使用相同的查询,以获得IDS为其[显示]列已到更新与当前日期时间 -

    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 
    ) 
    
    +0

    不,这是'to'字段。 – 2010-10-31 06:00:52

    +0

    噢好吧..根据你更新的问题很快就会编辑我的答案。 – pavanred 2010-10-31 06:37:32

    +0

    看到我更新的答案。 – pavanred 2010-10-31 07:52:47

    0

    关于点#1 您的表中没有字段“uniqueid”。我假设你的意思是“id”(你的主键)?如果是这种情况,您需要更新where子句(id为uniqueid的更改),或者除了编辑您的帖子之外别无选择,因此我们知道还有一个额外的字段。

    让我们假设你有所谓的“身份证”一个字段和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] 
    
    +0

    O right,uniqueid是对我而言,我会更新我的帖子 – 2010-10-31 05:37:48

    +0

    我已重新编辑帖子,并且您的假设不正确。 – 2010-10-31 05:40:59

    相关问题