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に設定し、2番目の行は1に設定し、3番目の行は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 に答える