我正在根据基于其他行的特定条件来更新某些行。可以说表格如下:

COLUMNS:   time              type     genre    doubles     triples
ROW 1:    2010.06.21 12:00    1        1        0            0
ROW 2:    2010.06.21 12:00    1        2        0            0
ROW 3:    2010.06.21 12:00    1        1        0            0
ROW 4:    2010.06.21 12:00    2        3        0            0
ROW 5:    2010.06.22 12:00    2        2        0            0
ROW 6:    2010.06.22 12:00    2        3        0            0
ROW 7:    2010.06.22 12:00    1        1        0            0


我正在根据以下规则更新doublestriples列:

1)仅查看更新行之间time=timetype=type的行(例如,第1,2,3行以及第5&6行)。

2)接下来计算这些行之间不同genre的数量,如果存在两个不同的genres,则将doubles列更改为1,或者如果存在三个,则将triples列更改为1。例如,在上表的第1,2,3行中,SO将具有doubles=1,因为在三行之间存在两种不同的流派。第5行和第6行也将具有doubles=1,因为在行之间又有两种不同的流派。 Doubles可以= 1,triples可以= 1,但不能同时为1。

现在,我想我可以很轻松地根据这些规则编写一些PHP,但是我想知道是否有办法在mysql中完成所有这些工作?似乎我总是对您可以从SQL语句中完成的数量感到惊讶。

可能是这样的(doublestriples列有两个不同的语句):

加倍-UPDATE myTable SET (doubles=1) WHERE time=time AND type=type ...但是您将如何解释上面的规则2(计算具有唯一流派的行数)。

这可能在mysql中出现还是PHP只是正确的选择?

提前致谢

最佳答案

当然,您可以在一个查询中完成此操作。使用此样本表:

create table duotri (time varchar(100), type int, genre int, doubles int, triples int);
insert duotri values
('2010.06.21 12:00'    ,1        ,1        ,0            ,0),
('2010.06.21 12:00'    ,1        ,2        ,0            ,0),
('2010.06.21 12:00'    ,1        ,1        ,0            ,0),
('2010.06.21 12:00'    ,2        ,3        ,0            ,0),
('2010.06.22 12:00'    ,2        ,2        ,0            ,0),
('2010.06.22 12:00'    ,2        ,3        ,0            ,0),
('2010.06.22 12:00'    ,1        ,1        ,0            ,0);


update语句应加入GROUPED表单以获得双打和三联。

update duotri t1
inner join (
    select time, type,
     case when count(distinct genre) = 2 then 1 else 0 end doubles,
     case when count(distinct genre) = 3 then 1 else 0 end triples
    from duotri
    group by time, type) t2
   on t1.time=t2.time and t1.type=t2.type
set t1.doubles=t2.doubles, t1.triples = t2.triples;

关于sql - mysql-基于其他行的UPDATE行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4908245/

10-11 20:02