标记记录共享字段所有

时间:2016-04-23 14:59:30

标签: mysql group-by

我有一个包含多个记录可以共享的fieldA的表。

我有另一个字段,值。

我有第三个字段,GroupLeaderFlag,该标记基于一些先前的关系,记录共享fieldA是该组中的核心记录,因此我可以进一步与它们之间的值和其他字段进行比较。

在某些情况下,我无法根据先前的关系标记给定组的GroupLeaderFlag。

因此,我希望使用以下规则执行标记GroupLeaderFlag的辅助过程:

  • 记录共享fieldA ID
  • 具有该fieldA ID的记录都没有GroupLeaderFlag,即所有共享fieldA的记录都是NULL
  • 符合该标准且价值最低的组中的记录(有两种或更多种情况可能共享最低值但很少见)

更新: 我意识到我有另一个字段GroupLeaderName,其中对于每个fieldA组,我将为该组确定/标记的记录的名称/ ID存储为GroupLeaderFlag,以便我在组中的每个记录中都有该名称/ ID。

因此,这成为另一个分组的字段,以获取没有以GroupLeader结尾的fieldA组。

我成功运行了Select,但无法将其转换为更新:

Select fieldA,Name,Min(Value),'X' 
as GroupLeaderFlag from TableA 
where GroupLeaderName is NULL  
group by fieldA

所以基本上我需要把它变成一个Update,这样我从select中获得的输出就是fieldA组中记录的名称,该组没有GroupLeaderFlag,该组中的最低值以及带有临时字段的价值' X'进入更新。

更新:我发现每个fieldA组按值asc自然排序,这使我无需提取每个组的最低值。所以我这样做了:

Update TableA as T1
Inner Join
(Select ID,GroupLeaderFlag from TableA 
group by fieldA having Count(GroupLeaderFlag )=0) as T2
On T1.ID=T2.ID set T1.GroupLeaderFlag ='X'

1 个答案:

答案 0 :(得分:0)

假设

  1. Name是唯一的(或至少在同一fieldA内)
  2. 标记列可以是'X'(查看您的示例)或''(空字符串) - 但我更喜欢01
  3. 此查询将返回新组长的名称:

    SELECT 
        fieldA,
        (SELECT Name FROM MyTable s 
         WHERE s.fieldA = n.fieldA 
         ORDER BY `Value` LIMIT 1) AS `Name`
    FROM MyTable n 
    GROUP BY fieldA 
    HAVING MAX(GroupLeaderFlag) = ''
    

    UPDATE中的内容合并到

    UPDATE MyTable u
    JOIN (
      SELECT 
          fieldA,
          (SELECT Name FROM MyTable s 
           WHERE s.fieldA = n.fieldA 
           ORDER BY `Value` LIMIT 1) AS `Name`
      FROM MyTable n 
      GROUP BY fieldA 
      HAVING MAX(GroupLeaderFlag) = ''
    ) AS f USING (fieldA)
    SET GroupLeaderFlag = IF(u.`Name` = f.`Name`, 'X', ''),
    GroupLeaderName = f.`Name`;
    

    概念证明:http://sqlfiddle.com/#!9/a9be4b/1