Tested on MySQL version 4.0.23, 4.1.8 and 4.1.10
OS: RedHat Fedora Core 2 / RedHat 8
Table type: InnoDB or MyISAM

Table structure:

CREATE TABLE `param_str` (
  `id` int(11) NOT NULL default '0',
  `name` varchar(32) NOT NULL default '',
  `value` varchar(255) default NULL,
  `match` varchar(255) default NULL,
  `match2` varchar(255) default NULL,
  `weight` tinyint(4) default NULL,
  KEY `id-name-value-match-match2`
(`id`,`name`,`value`(20),`match`(20),`match2`(20))
) TYPE=InnoDB;

`id` links to a table with the accounts whose string parameters are stored
in this table.

The object of the query is to update a field that contains a hit counter and
the last 9 (that is maximum 9) unique ID's that caused the hits. Proposed
format was: <hits>;,<id1>,<id2>,...

I tried to fix an bug when an existing id starts with the new id (e.g. 11305
is in the list and a new hit is from id 113).

UPDATE `param_str`
SET `value` =
 CONCAT_WS(
  ';',
  (
   SUBSTRING_INDEX(
    COALESCE(`value`,''),
    ';',
    1
   ) + 1
  ),
  CONCAT_WS(
   ',',
   SUBSTRING_INDEX(
    REPLACE(
     SUBSTRING(
      COALESCE(`value`,'') FROM
      LOCATE(
       ';',
       COALESCE(`value`,'')
      ) + 1
     ),
     CONCAT(
      ',' ,
      '113',
      ','
     ),
     ','
    ),
    ',' ,
    -(9 -1)
   ),
   '113'
  )
 ) WHERE
 `id`=6  AND
 `name`='prf_hits'

I started out with the value "1;,11305" for the first hit by ID 11305 (which
is inserted by an INSERT query).
The query above resulted in 'affected rows: 9' and the value of the single
(!) row was "10;,11305,113,113"; the double 113 was caused by the bug I
mentioned before, but I'm now focussing on the counter part of the value.
I repeated the query and now it returned 'affected rows: 90' and the value
in the row was "100;,11305,113,113".

Various tests with different hit counter values show that the update is
repeated until the next power of 10 is reached:
1 -> affected: 9 -> 10
12 -> affected: 88 -> 100
413 -> affected: 578 -> 1000

Since the WHERE clause clearly identifies a single row in our table, I'm
beginning to think of a bug...

Any ideas or suggestions?

Regards, Jigal.


-- 
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe:    http://lists.mysql.com/[EMAIL PROTECTED]

Reply via email to