我在表格(称为SubTask
)中有数据,如下所示:
STID ID HIVAL TASK
1 4 ...
2 4
3 4
4 4 1
5 5
6 5
7 5
8 5
9 5 1
如您所见,hival
列标有1,表示每组中stid
的最高stid
(select stid, id, task from subtask where stid in (select max(stid) from subtask group by id)
是唯一编号)。我无法弄清楚如何更新表来反映这一点。使用以下查询,我可以选择记录:
hival
选择后,如何更新记录以在s = 'Hello world'
d = {char: s.count(char) for char in set(s)}
列中添加1?
答案 0 :(得分:3)
hival
列完全是多余的,并且具有适得其反的效果。正如您已经发现的那样,更新它是一个复杂的查询,并且是一个很大的性能影响。更糟糕的是,每次数据更改时都必须更新它。
相反,只需删除该列并执行
SELECT max(stid), id from subtask GROUP BY id
答案 1 :(得分:1)
我质疑hival
专栏的好处,并想知道为什么实际需要这样做,但这不是你问的问题。
如果需要拥有hival
列,并使用所述规则填充它,我首先编写一个SELECT语句,然后将其转换为多表UPDATE言。
您已经开始编写查询了。
SELECT q.id
, MAX(q.stid)
FROM subtask q
GROUP BY q.id
将其用作内联视图。我们可以做一个外部联接。如果我们有匹配的行,那么hival应为1,否则hival将为NULL。
这样的事情:
SELECT IF(s.id IS NOT NULL,1,NULL) AS new_hival
, t.*
FROM subtask t
LEFT
JOIN ( SELECT q.id
, MAX(q.stid) AS max_stid
FROM subtask q
GROUP BY q.id
) s
ON s.id = t.id
AND s.max_stid = t.stid
我们可以将SELECT ... FROM
替换为UPDATE
关键字并添加SET
子句,将其转换为UPDATE语句。 (我们可能希望将其他行上的hival
设置为1以外的值。这里,我们假设它将设置为NULL。)
这样的事情:
UPDATE subtask t
LEFT
JOIN ( SELECT q.id
, MAX(q.stid) AS max_stid
FROM subtask q
GROUP BY q.id
) s
ON s.id = t.id
AND s.max_stid = t.stid
SET t.hival = IF(s.id IS NOT NULL,1,NULL)
再次,首先编写一个SELECT语句,它将返回新的' hival'要分配的值,并验证它是否正常工作。在测试之后,将其转换为UPDATE语句。
一个完全不同的问题(一个没有被问到的问题)是评估是否确实需要hival
列。这个问题在这里没有解决。)
答案 2 :(得分:0)
UPDATE SubTask AS s1
LEFT OUTER JOIN SubTask AS s2
ON s1.ID = s2.ID AND s1.STID < s2.STID
SET s1.hival = CASE WHEN s2.ID IS NULL THEN 1 ELSE NULL END;
答案 3 :(得分:0)
如果我是你,我根本就没有HIVAL,但我认为这是最简单的方法:
update SubTask as st_1
left join SubTask as st_2
on st_1.ID = st_2.ID
and st_1.STID < st_2.STID
set st_1.HIVAL = 1
where st_2.ID is null;