2

假设我有一个名为members的表,其结构如下:

member_id, col1, col2, number

现在,如果我运行这个查询:

SELECT @rownum:=@rownum+1 number, member_id 
FROM members, (SELECT @rownum:=0) r ORDER BY col1 DESC, col2 DESC

我得到每一行的数字。是否可以将此编号分配给每一行的列号?

例如,如果表包含以下数据:

1 1000 1.2 0
2 8700 1.1 0
3 1000 1.1 0

第一行编号列应设置为 2,第二行设置为 1,第三行设置为 3。

4

2 回答 2

2

您可以使用临时表来存储值并UPDATE通过连接从中获取值。

/* Store query result in a temporary table */
CREATE TEMPORARY TABLE ranks AS
  SELECT @rownum:=@rownum+1 number, member_id FROM members, (SELECT @rownum:=0) r ORDER BY col1 DESC, col2 DESC;

/* And join against it to update your members.number column */
UPDATE 
  members
  JOIN ranks ON members.member_id = ranks.member_id
SET members.number = ranks.number;

DROP TABLE ranks;

实际上,通过我刚才的测试,我能够在没有临时表的情况下做到这一点。我不认为 MySQL 会允许从子查询更新同一个表,但显然它允许与相关子查询一起使用。

UPDATE 
  members 
  /* JOIN against a subquery which returns the rank values */
  JOIN ( 
   SELECT @rownum:=@rownum+1 number, member_id 
   FROM members, (SELECT @rownum:=0) r
   ORDER BY col1 DESC, col2 DESC
  ) ranks ON members.member_id = ranks.member_id 
/* And set the number column to the rank */
SET members.number = ranks.number;

SQLfiddle.com 演示

于 2013-01-12T23:03:38.393 回答
0

你可以试试这个

update members A
INNER JOIN
(
    SELECT @rownum:=@rownum+1 number, member_id 
    FROM members, (SELECT @rownum:=0) r 
    ORDER BY col1 DESC, col2 DESC
) B ON A.member_id = B.member_id
SET A.number = B.number;
于 2013-01-12T23:19:24.543 回答