mysql - 在查询中使用 LEFT JOIN 或 GROUP BY 时,CONCAT() 结果意外截断

标签 mysql concatenation

包含 CONCAT() 的 MySQL 查询意外截断结果并仅返回预期的 6 个字符中的 5 个('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) 未签名。结果不受结果表是否包含要连接的行的影响。

临时解决方法是使用 TRIM(CONCAT(c.club,c.crewno,' ')),它返回预期值:

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

但是,与其忍受丑陋的解决方法,我更愿意了解潜在的问题并正确修复它!

编辑 1:如果使用三位数 crewno,则仅返回第一个数字,要使用我的解决方法获得所有三个数字,我需要添加双空格 TRIM(CONCAT(c .club,c.crewno,' ')).

编辑 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;

最佳答案

看来MySQL doesn't always do what you would expect当您将 CONCAT 与数值一起使用时。您应该对数值使用 CAST:

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

关于mysql - 在查询中使用 LEFT JOIN 或 GROUP BY 时,CONCAT() 结果意外截断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7514609/

相关文章:

php - 如何使用同一个 Eloquent 查询两次,但使用一个不同的 where 子句?

javascript - 每次单击按钮时都将数字连接到 url 吗?

r - 将字符列合并为新列

php - 从 mysql 数据库中选择与重复结果相同的行

java - MySQLSyntaxErrorException : Access denied for user

php - Laravel 从 ManyToOne 关系错误 SQLSTATE [23000] 创建 Eloquent 实例

php - 如何计算 MySQL 存储过程中的年龄?

c - 使用 strcat 的段错误

sql - Presto:将整数数组转换为字符串?

连接两个数组