Запрос 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;