我有两张桌子:
CREATE TABLE IF NOT EXISTS `tools` (
`pk_id` int(11) NOT NULL AUTO_INCREMENT,
`id` int(11) NOT NULL,
`title` varchar(13) DEFAULT NULL,
PRIMARY KEY (`pk_id`));
CREATE TABLE IF NOT EXISTS `features` (
`pk_id` int(11) NOT NULL AUTO_INCREMENT,
`id` int(11) NOT NULL,
`feature` varchar(13) DEFAULT NULL,
`number` int(11),
PRIMARY KEY (`pk_id`),
FOREIGN KEY (id) REFERENCES tools(id));
然后我有脚本(见下文)来获得这样的东西:
Tools Feature1 Feature2 Feature3 Feature4
=========================================
ToolA 1 0 0 1
ToolB 0 0 1 0
当我在行1
中添加number
而不是MAX(IF(pa1.feature = "', feature,'", "', number, '", "', 0, '"))
时,脚本运行正常。否则它表示此行存在一些错误。为什么以及如何解决它?
SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'MAX(IF(pa1.feature = "', feature,'", "', number, '", "', 0, '")) AS ', REPLACE(feature, ' ', '')
)
) INTO @sql
FROM features;
SET @sql = CONCAT('SELECT p.id
, p.title
, ', @sql, '
FROM tools p
LEFT JOIN features AS pa1
ON p.id = pa1.id
GROUP BY p.id');
SELECT concat('SQL: ', @sql);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
更新
这是由上述脚本创建的原始SQL语句,其中包含一些错误:
SELECT p.id \ n,p.title \ n,MAX(IF(pa1.feature = \" feature 68 \",\" 6 \",\ " 0 \"))AS feature68,MAX(IF(pa1.feature = \" feature 68 \",\" 7 \",\" 0 \"))AS feature68,MAX(IF(pa1.feature = \" feature 68 \",\" 1 \",\" 0 \"))AS feature68,MAX(IF(pa1.feature = \" feature 172 \",\" 2 \",\" 0 \"))AS feature172,MAX(IF(pa1.feature = \" feature 56 \",\" 1 \",\" 0 \"))AS feature56,MAX(IF(pa1.feature = \" feature 193 \",\" 4 \",\" 0 \"))AS feature193,MAX(IF(pa1.feature = \" feature 71 \",\" 3 \",\" 0 \"))AS feature71,MAX(IF(pa1.feature = \" feature 201 \",\" 2 \",\" 0 \"))AS feature201,MAX(IF(pa1.feature = \" feature 80 \",\" 2 \",\" 0 \"))AS feature80,MAX(IF(pa1.feature = \" feature 203 \",\" 5 \",\" 0 \"))AS feature203,MAX(IF(pa1.feature = \" feature 82 \",\" 8 \",\" 0 \"))AS feature82,MAX(IF(pa1.feature = \" feature 80 \",\" 9 \",\" 0 \"))AS feature80,MAX(IF(pa1.feature = \" feature 82 \",\" 9 \",\" 0 \"))AS feature82,MAX(IF(pa1.feature = \" feature 201 \",\" 5 \",\" 0 \"))AS feature201,MAX(IF(pa1.feature = \" feature 80 \",\" 15 \",\" 0 \"))AS feature80,MAX(IF(pa1.feature = \" feature 56 \",\" 3 \",\" 0 \"))AS feature56,MAX(I \ n FROM tools p \ n
LEFT JOIN功能AS pa1 \ n ON p.id = pa1.id \ n
GROUP BY p.id
正如我所说,如果我用number
替换1
,那么相同的代码也可以。
答案 0 :(得分:0)
我发现您发布的代码存在两个问题。
在sql字符串中通常使用单引号而不是双引号指定。我不是100%使用mysql,因此该平台可能允许您拥有此处的代码。
查看最后一个字段MAX(I \n FROM tools
这显然是错误的。
这可能是两件事之一。 @SQL
是小的,或者数字列中有空。如果问题是你有一个null,那么这将修复将在你的select语句中使用它。
FROM features
WHERE number is not null;