Результат CONCAT () неожиданно обрезается, когда в запросе используется LEFT JOIN или GROUP BY - PullRequest
2 голосов
/ 22 сентября 2011

Запрос MySQL, содержащий CONCAT(), неожиданно обрезает результат и возвращает только 5 из ожидаемых 6 символов ('abcd2' вместо abcd21 ').Ниже приведена сокращенная версия фактического запроса:

SELECT c.cid, c.club, c.crewno, CONCAT(c.club,c.crewno) crewcode
 FROM `crews` c
 LEFT JOIN `results` r ON r.rno=c.cid
 GROUP BY c.cid;

Вышеприведенный запрос возвращает:

54321, 'abcd', 21, 'abcd2'
65432, 'abcd', 1, 'abcd1'

Однако, если LEFT JOIN удалено и / или если GROUP BYудаляется, тогда CONCAT() работает как положено и возвращает:

54321, 'abcd', 21, 'abcd21'
65432, 'abcd', 1, 'abcd1'

Я понятия не имею, в чем проблема ...

Дополнительная информация: поле c.club имеет тип VARCHAR(4) и поле c.crewno имеет тип TINYINT(1) UNSIGNED.На результат не влияет то, содержит ли таблица результатов строки для объединения.

Временный обходной путь используется с помощью TRIM(CONCAT(c.club,c.crewno,' ')), который возвращает ожидаемые значения:

54321, 'abcd', 21, 'abcd21'
65432, 'abcd', 1, 'abcd1'

Однако,вместо того, чтобы жить с уродливым обходным путем, я бы предпочел узнать, в чем заключается основная проблема, и правильно ее исправить!

Редактировать 1: если используется трехзначное число crewno, то возвращается только первая цифра ичтобы получить все три, используя мой обходной путь, мне нужно добавить двойной пробел TRIM(CONCAT(c.club,c.crewno,' ')).

Edit 2: SQL для настройки таблиц, чтобы продемонстрировать проблему следующим образом.Это не рабочий SQL, а минимальный набор полей, необходимых для репликации проблемы.(Примечание: когда таблица результатов полностью пуста, CONCAT() работает как положено, но как только у него есть данные, CONCAT возвращает неожиданные результаты)

CREATE TABLE IF NOT EXISTS `crewsmin` (
 `cid` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
 `club` varchar(4) NOT NULL DEFAULT '',
 `crewno` tinyint(1) unsigned NOT NULL DEFAULT '0',
 PRIMARY KEY (`cid`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 PACK_KEYS=1;
INSERT INTO `crewsmin` (`cid`, `club`, `crewno`) VALUES
 (12345, 'abcd', 0),
 (12346, 'bcde', 5),
 (12347, 'cdef', 13),
 (12348, 'defg', 42),
 (12349, 'efgh', 107);

CREATE TABLE `resultsmin` (
 `rid` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
 `cid` mediumint(8) unsigned NOT NULL DEFAULT '0',
 `result` tinyint(3) NOT NULL DEFAULT '0',
 PRIMARY KEY (`rid`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 PACK_KEYS=1;
INSERT INTO `resultsmin` (`rid`, `cid`, `result`) VALUES
 (1, 12345, 3),
 (2, 12345, 1);

SELECT c.cid, c.club, c.crewno, CONCAT(c.club,c.crewno) crew
 FROM crewsmin c
 LEFT JOIN resultsmin r ON r.cid=c.cid
 GROUP BY c.cid;

1 Ответ

3 голосов
/ 22 сентября 2011

Кажется, что MySQL не всегда делает то, что вы ожидаете , когда вы используете CONCAT с числовыми значениями. Вы должны использовать CAST для числовых значений:

CONCAT(c.club,CAST(c.crewno AS CHAR))
...