【问题标题】:Updating a field based on a count of records from a different table根据来自不同表的记录数更新字段
【发布时间】:2012-10-31 10:30:46
【问题描述】:

我需要在另一个表中给定角色的计数大于 1 的表中设置一个值。

表 cursillo.members 具有字段 memid 和 hsd。表 cursillo.teams 具有字段 memid(两者之间的链接),一个字段称为运动,另一个字段称为角色。

我想要完成的是与此类似的事情:

update cursillo.members_eligible p, cursillo.teams pp
   set p.hsd=1     
 where p.memid = pp.memid AND (pp.role = 'HSD' OR pp.role = 'SD')
   and pp.movement = 'Cursillo' AND count(pp.role) > 1;

或者这个:

update members_eligibile
   set hsd=1 
  from teams 
 where teams.memid=members_eligible.memid 
   and (teams.role = 'HSD' OR teams.role = 'SD')  
   and teams.movement = 'Cursillo' 
   and count(teams.role) > 1;

换句话说,如果给定的 memid 在 cursillo.teams 表中有多个记录,其中角色的值等于 HSD 或 SD,则将 cursillo.members_eligible.hsd 设置为 1。

我不知道如何处理 count() 部分。

谢谢, 迈克·里德

【问题讨论】:

    标签: sql count


    【解决方案1】:

    可能重复的问题:

    MySQL - Using COUNT(*) in the WHERE clause

    尝试使用“有”关键字

    这是链接答案中的相关部分(在本例中为 select 语句):

    select gid
    from `gd`
    group by gid 
    having count(*) > 10
    order by lastupdated desc
    

    看起来 'have' 只能在选择语句中使用: http://www.mysqltutorial.org/mysql-having.aspx

    因此您可能需要让更新的 where 子句包含一个 select 语句:

    update members_eligibile
       set hsd=1 
      from teams 
     where teams.memid=members_eligible.memid 
       and (teams.role = 'HSD' OR teams.role = 'SD')  
       and teams.movement = 'Cursillo' 
       and members_eligible.memid IN
       (SELECT members_eligible.memid from members_eligible where teams.memid=members_eligible.memid  having count(teams.role) > 1);
    

    你将不得不调整选择语句,我还没有测试过

    【讨论】:

    • 我是这个 MySql 的新手,正在学习如何使用这些命令。这个建议,我在搜索时发现的,很好,但我不知道如何将其合并到我需要完成的内容中。有人有什么想法吗?
    • 它看起来只能与 select 一起使用:mysqltutorial.org/mysql-having.aspx 尝试使用 select 子查询进行更新,我会更新我的答案
    【解决方案2】:

    SQL Server 2005+

    UPDATE x
    SET x.hsd = 1
    FROM (SELECT e.hsd, COUNT(*) OVER (PARTITION BY t.role) AS cnt
          FROM teams t JOIN members_eligibile e ON t.memid = e.memid
          WHERE (t.role = 'HSD' OR t.role = 'SD') AND t.movement = 'Cursillo') x
    WHERE x.cnt > 1 
    

    【讨论】:

    • 谢谢亚历山大。我将它复制到 MySQL 的编辑器中,但无法运行。 SQL Server 2005+ 和 MySql 之间可能存在一些语法差异。它确实给了我一个学习和学习的地方,所以我会继续玩它,看看我能不能弄明白。
    猜你喜欢
    • 1970-01-01
    • 2023-04-11
    • 1970-01-01
    • 2017-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-17
    • 1970-01-01
    相关资源
    最近更新 更多