0

次の Mysql テーブルに対するクエリで奇妙な問題が発生しています。

CREATE TABLE `BulkTransuploads` (
  `bulktransuploads_id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id of the upload',
  `bulktransuploads_time` datetime NOT NULL COMMENT 'The upload time',
  `bulktransuploads_val_id` int(10) unsigned NOT NULL COMMENT 'TransactionID value. value 1',
  `bulktransuploads_val_orderid` varchar(100) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'OrderID value. value 2',
  `bulktransuploads_val_url` varchar(400) NOT NULL COMMENT 'URL value. value 3',
  `bulktransuploads_val_tracking` varchar(40) NOT NULL COMMENT 'Tracking value. value 4',
  `bulktransuploads_status_v1` varchar(150) NOT NULL COMMENT 'Status for value1. OK or error message',
  `bulktransuploads_status_v2` varchar(150) NOT NULL COMMENT 'Status for value2. OK or error message',
  `bulktransuploads_status_v3` varchar(150) NOT NULL COMMENT 'Status for value3. OK or error message',
  `bulktransuploads_status_v4` varchar(150) NOT NULL COMMENT 'Status for value4. OK or error message',
  PRIMARY KEY (`bulktransuploads_id`)
) ENGINE=ARCHIVE AUTO_INCREMENT=242 DEFAULT CHARSET=utf8

IDを持ついくつかの値を抽出する必要があるため、最短の方法はIN句を使用することだと思いました。

mysql> SELECT * FROM BulkTransuploads WHERE bulktransuploads_id IN (233,231,232)\G;

上記のクエリは、次の結果を返します。

*************************** 1. row ***************************
          bulktransuploads_id: 231
*************************** 2. row ***************************
          bulktransuploads_id: 232
*************************** 3. row ***************************
          bulktransuploads_id: 233
3 rows in set (0.00 sec)

ここでスペースを確保するために、他の列の値を削除しました。この順序はクエリ (IN 句) に記述されているため、別の順序 (233,231,232) を期待していましたが、全体として、このクエリはほぼ期待どおりに動作します。結果を降順に並べる必要があるため、クエリを次のように変更しました。

mysql> SELECT * FROM BulkTransuploads WHERE bulktransuploads_id IN (233,231,232) ORDER BY bulktransuploads_id DESC\G;

私の新しいクエリは厄介な結果を返します:

*************************** 1. row ***************************
          bulktransuploads_id: 200
*************************** 2. row ***************************
          bulktransuploads_id: 200
*************************** 3. row ***************************
          bulktransuploads_id: 200
3 rows in set (0.00 sec)

id 200 が 3 回返される理由がわかりません。クエリ間の唯一の違いは ですORDER BY bulktransuploads_id DESC。したがって、間違いなく ORDER BY 句が結果を台無しにしていますが、私の質問はなぜですか?

4

1 に答える 1

0

InnoDB を使用する代わりに、使用している ENGINE を変更する必要があります。

CREATE TABLE クエリを次のように変更します。

CREATE TABLE `BulkTransuploads` (
  `bulktransuploads_id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id of the upload',
  `bulktransuploads_time` datetime NOT NULL COMMENT 'The upload time',
  `bulktransuploads_val_id` int(10) unsigned NOT NULL COMMENT 'TransactionID value. value 1',
  `bulktransuploads_val_orderid` varchar(100) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'OrderID value. value 2',
  `bulktransuploads_val_url` varchar(400) NOT NULL COMMENT 'URL value. value 3',
  `bulktransuploads_val_tracking` varchar(40) NOT NULL COMMENT 'Tracking value. value 4',
  `bulktransuploads_status_v1` varchar(150) NOT NULL COMMENT 'Status for value1. OK or error message',
  `bulktransuploads_status_v2` varchar(150) NOT NULL COMMENT 'Status for value2. OK or error message',
  `bulktransuploads_status_v3` varchar(150) NOT NULL COMMENT 'Status for value3. OK or error message',
  `bulktransuploads_status_v4` varchar(150) NOT NULL COMMENT 'Status for value4. OK or error message',
  PRIMARY KEY (`bulktransuploads_id`)
) ENGINE=InnoDB AUTO_INCREMENT=200 DEFAULT CHARSET=utf8;
于 2015-04-05T18:18:28.763 に答える