22

データベースの 1 つに「textile_events」という名前のテーブルがあります。

mysql> describe textile_events;

+-------------+--------------+-----+---------+----------------+
| Field       | Type         | Key | Default | Extra          |
+-------------+--------------+-----+---------+----------------+
| id          | int(11)      | PRI | NULL    | auto_increment |
| token       | varchar(20)  |     | NULL    |                |
| reg_time    | datetime     |     | NULL    |                |
| eid         | varchar(20)  |     | NULL    |                |
| fname       | varchar(20)  |     | NULL    |                |
| lname       | varchar(20)  |     | NULL    |                |
| paid        | varchar(10)  |     | NULL    |                |
| seq_no      | int(11)      |     | NULL    |                |
+-------------+--------------+-----+---------+----------------+
8 rows in set (0.00 sec)

mysql> select count(*) from textile_events;

+----------+
| count(*) |
+----------+
|     9325 |
+----------+
1 row in set (0.00 sec)

mysql> select count(*) from textile_events where eid = 'headsup' ;

+----------+
| count(*) |
+----------+
|     2553 |
+----------+
1 row in set (0.01 sec)

「seq_no」フィールドは、昨日上記の表に導入されました。

ここで、有料フィールドが「有料」に等しいすべての「headsup」イベントの「seq_no」フィールドに増分番号を割り当てる必要があります。

別の方法で、私はこのようなものを探しています、

$i = 250
while( true ):
    $i++
    UPDATE textile_events SET 'seq_no' = $i 
        WHERE eid = 'headsup' AND paid = 'paid'
endwhile;

特定の条件を満たすレコードにのみ、新しく導入されたフィールドに増分番号を割り当てるにはどうすればよいですか?

利用可能なオプションと、これを達成するための最も効率的な方法は何ですか?

4

3 に答える 3

59

このようなものをお探しですか?

UPDATE textile_events e,
       (SELECT @n := 249) m
   SET e.seq_no = @n := @n + 1 
    WHERE e.eid = 'headsup' AND e.paid = 'paid'

SQLフィドル

于 2013-05-20T07:34:37.530 に答える
13

簡単なクエリは、変数を必要な数値に設定するだけです。次に、その数値から 1 を増やして、必要な列を更新します。

例:: 列が null であるすべての行を更新するクエリ。1をインクリメントして各行IDを更新します

    SET @a  = 50000835 ;  
    UPDATE `civicrm_contact` SET external_identifier = @a:=@a+1 
    WHERE external_identifier IS NULL;
于 2015-01-14T12:46:31.120 に答える
4

多分これはあなたを助けるでしょう...

DELIMITER $$
DROP PROCEDURE IF EXISTS manual_increment_count$$
CREATE PROCEDURE manual_increment_count()
  BEGIN
    DECLARE count INT DEFAULT 0;
    DSELECT COUNT(*) INTO count FROM textile_events;
    WHILE count > 0 DO
      SET count = count + 1;
      update textile_events 
        set seq_no = count  where eid = 'headsup' AND paid = 'paid'; 
    END WHILE;
  END$$
DELIMITER ;
CALL manual_increment_count();
于 2013-05-20T07:45:47.217 に答える