2

aを含むMySQLクエリCONCAT()は、予期せず結果を切り捨てて、予想される6文字のうち5文字のみを返します(abcd21'ではなく'abcd2')。実際のクエリの縮小版は次のとおりです。

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:3桁crewnoが使用されている場合は、最初の桁のみが返され、回避策を使用して3つすべてを取得するには、ダブルスペースを追加する必要があります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;
4

1 に答える 1

3

数値で CONCAT を使用する場合、MySQLは常に期待通りの動作をするとは限りません。数値には CAST を使用する必要があります。

CONCAT(c.club,CAST(c.crewno AS CHAR))
于 2011-09-22T17:31:10.793 に答える