时间:2017-05-03 15:00:01

标签: mysql

我在表格(称为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的最高stidselect 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?

4 个答案:

答案 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;