我正在根据基于其他行的特定条件来更新某些行。可以说表格如下:
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
我正在根据以下规则更新
doubles
和triples
列:1)仅查看更新行之间
time=time
和type=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语句中完成的数量感到惊讶。
可能是这样的(
doubles
和triples
列有两个不同的语句):加倍-
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/