我有一个表,其中包含多个记录可以共享的字段A。
我还有另一个字段,值。
我有第三个字段 GroupLeaderFlag,该标志基于一些先前的关系,该记录共享字段 A 是该组中的核心记录,因此我可以与它们之间的值和其他字段进行进一步比较。
在某些情况下,我无法根据先前的关系为给定组标记组领导标志。
因此,我想执行一个辅助过程,使用以下规则标记组领导标志:
- 记录共享字段 ID
- 具有该字段 ID 的所有记录都没有 GroupLeaderFlag,即共享字段 A 的所有记录都是空的 满足该条件且值最低的
- 组中的记录(在某些情况下,两个或多个可以共享最低值,但这种情况很少见)
更新:我意识到我还有另一个字段 GroupLeaderName,对于每个字段 A 组,我将我为该组确定/标记的记录的名称/ID 存储为 GroupLeaderFlag,以便我在组中的每条记录中都有该名称/ID。
因此,这成为另一个分组字段,以获取最终没有组长组长的字段A组。
我成功运行了选择,但无法将其转换为更新:
Select fieldA,Name,Min(Value),'X'
as GroupLeaderFlag from TableA
where GroupLeaderName is NULL
group by fieldA
所以基本上我需要将其转换为更新,以便我从 select 获得的输出,即字段中记录的名称一个组,该组没有 GroupLeaderFlag 和该组中的最低值以及值为"X"的临时字段更新。
更新:我发现每个字段A组自然是按值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'
假设
- 列
Name
是唯一的(或至少在同一fieldA
内) - 标志列要么是
'X'
(查看您的示例)要么是''
(空字符串)——尽管我更喜欢0
或1
值
此查询将返回新组领导的姓名:
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