Проблема с MySQL с предложением IN и ORDER BY

У меня возникла странная проблема с запросом к следующей таблице 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

Мне нужно извлечь некоторые значения, имеющие идентификаторы, поэтому я подумал, что кратчайший путь — использовать предложение 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)

Я удалил значения других столбцов, чтобы освободить здесь место. В целом этот запрос делает почти то, что я ожидал, хотя я ожидал другого порядка (233 231 232), поскольку этот порядок был записан в запросе (предложение IN). Поскольку мне нужно, чтобы результаты были упорядочены по убыванию, я изменил свой запрос следующим образом:

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)

Я не могу понять, почему он возвращает 3 раза идентификатор 200. ЕДИНСТВЕННАЯ разница между запросами - ORDER BY bulktransuploads_id DESC , поэтому, несомненно, предложение ORDER BY искажает мои результаты, но мой вопрос: почему?


person SASA Aga    schedule 05.04.2015    source источник
comment
Можете ли вы поделиться некоторыми данными?   -  person Abhik Chakraborty    schedule 05.04.2015
comment
Вы можете создать sqlfiddle?   -  person Beginner    schedule 05.04.2015
comment
sqlfiddle sqlfiddle.com/#!9/0da17/4 Я вставил несколько случайных данные. Сами данные не имеют значения, здесь важны идентификаторы   -  person SASA Aga    schedule 05.04.2015


Ответы (1)


Вам нужно изменить ДВИГАТЕЛЬ, который вы используете, вместо этого используйте InnoDB.

Измените запрос 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;
person Raj Ankur    schedule 05.04.2015
comment
Ваше предложение работает, однако я использовал механизм хранения ARCHIVE, чтобы ограничить дальнейшие запросы UPDATE или DELETE. Ваш подход подразумевает, что я создаю триггеры. С триггерами в Mysql другая проблема, они не поддерживают ROLLBACK, вместо этого мне приходится писать какие-то запросы, которые могут имитировать ошибку, и только таким образом триггер не сработает, поэтому DELETE или UPDATE также не сработают. Но в чем причина того, что мой запрос ведет себя странно на механизме хранения ARCHIVE? - person SASA Aga; 05.04.2015