0

我的数据库中有下表:

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分配给特定批次中的候选人。即每个 batch_id 的 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 分配给候选人有什么方法可以实现我正在尝试的。 ..最重要的是,我清楚了吗?提前谢谢大家。

4

2 回答 2

1

这会工作吗?

SET @id := 0;
UPDATE candidate c
SET roll_no = (@id := @id + 1)
WHERE batch_id = 5
ORDER BY candidate_name ASC;
于 2013-07-10T17:58:11.770 回答
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:=@a+1)
WHERE batch_id = 5

在同一个查询 mysql 中从 update+order by得到一些想法

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

于 2013-07-11T04:10:57.087 回答