2013-07-10 88 views
0

我在我的数据库如下表:UPDATE表名,(SELECT @id:= 0)DM SET sale_id =(@id:= @id 1)

CREATE TABLE IF NOT EXISTS `candidate` (
    `candidate_id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `roll_no` int(10) unsigned NOT NULL, 
    `candidate_name` varchar(255) DEFAULT NULL, 
    `batch_id` int(10) unsigned NOT NULL, 
    PRIMARY KEY (`candidate_id`), 
    KEY `candidate_name` (`candidate_name`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=COMPACT; 

我需要做的是将roll_no分配给特定批次中的候选人。即roll_no将从1开始,每个batch_id。 *(不用说,每批或每批有数千个候选人)*。默认情况下,roll_no字段的值为0。

我试着这样做:

UPDATE candidate c, (SELECT @id := 0) serial 
SET roll_no = (@id := @id + 1) 

WHERE c.batch_id = 5 
ORDER BY c.candidate_name ASC 

结果造成:不正确使用UPDATE和ORDER BY的 如果我省略ORDER BY子句,它工作正常,但我需要根据roll_no分配给考生他们的名字的升序 有没有什么办法可以实现我正在尝试的......最重要的是,我清楚了吗? 提前感谢你。

回答

0

尤里卡!这奏效了

UPDATE candidate c 
JOIN (SELECT candidate_id, candidate_name FROM candidate ORDER BY candidate_name ASC) co ON (c.candidate_id = co.candidate_id) 
JOIN (SELECT @a:=0) dm 
SET roll_no = (@a:[email protected]+1) 
WHERE batch_id = 5 

得到了一些想法来自
update+order by in same query mysql

埃里克·卢克曼,感谢您的答复。

0

这工作?

SET @id := 0; 
UPDATE candidate c 
SET roll_no = (@id := @id + 1) 
WHERE batch_id = 5 
ORDER BY candidate_name ASC; 
+0

对不起,它没有工作! –

相关问题