CREATE TABLE `tUSER` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`id_number` varchar(20) NOT NULL,
`first_names` varchar(100) NOT NULL,
`last_name` varchar(100) NOT NULL
PRIMARY KEY (`id`),
INDEX( `id_number`, `first_names`, `last_name`)
)
CREATE TABLE `tPROFILE` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`tUSER_id` bigint(20) DEFAULT NULL,
`tTYPES_id` bigint(20) DEFAULT NULL,
`value` varchar(100) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `unique_index` (`tUSER_id`,`tTYPES_id`),
INDEX( `tUSER_id`, `tTYPES_id`, `value`)
)
CREATE TABLE `tTYPES` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`type` varchar(100) NOT NULL DEFAULT '',
`description` varchar(255) NOT NULL,
`deleted` tinyint(1) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
FULLTEXT( `type`, `description`)
)上面的模式需要从给定的ID号或手机号码(Cellphone是tTYPES表中的一个记录)中获得一个支点表。
我的静态枢轴可以工作,因为我已经填充了表并知道了类型。
select tUSER.*,
max(CASE WHEN tTYPES.type = 'msisdn' THEN tPROFILE.value ElSE 0 END) AS 'msisdn',
max(CASE WHEN tTYPES.type = 'network' THEN tPROFILE.value ELSE 0 END) AS 'network',
max(CASE WHEN tTYPES.type = 'points' THEN tPROFILE.value ELSE 0 END) AS 'points',
max(CASE WHEN tTYPES.type = 'card number' THEN tPROFILE.value ELSE 0 END) AS 'card number',
max(CASE WHEN tTYPES.type = 'gender' THEN tPROFILE.value ELSE 0 END) AS 'gender'
from e1m_test.tUSER
inner join e1m_test.tPROFILE on tPROFILE.tUSER_id = tUSER.id
inner join e1m_test.tTYPES on tPROFILE.tTYPES_id = tTYPES.id
where tUSER.id = 312我需要一个动态枢轴查询,因为我并不总是知道下面的类型是我当前的工作,但它告诉我一个语法错误,我无法解决。
SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT('max(CASE WHEN tTYPES.type="',
tTYPES.type, '" THEN tPROFILE.value ELSE 0 END) AS '
, tTYPES.type))
INTO @sql
FROM
tTYPES, tPROFILE;
SET @sql = CONCAT('select tUSER.*, ', @sql, '
from tUSER
left join tPROFILE on tPROFILE.tUSER_id = tUSER.id
left join tTYPES on tPROFILE.tTYPES_id = tTYPES.id
where tUSER.id = 312');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;误差
09:54:06 PREPARE stmt FROM @sql Error Code: 1064. You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'number,max(CASE WHEN tTYPES.type="gender" THEN tPROFILE.value ELSE 0 END) AS gen' at line 1 0.141 sec欢迎任何帮助或指导。
发布于 2020-11-02 09:26:31
tTYPE中可能存在与MySQL关键字冲突的类型(例如,number是语言关键字)。您需要使用backticks引用这些标识符。
进一步建议:
我不明白为什么在生成条件表达式的查询中需要表group_concat() (表tPROFILE );显然,在中distinct似乎没有必要
。
group_concat()中不需要concat();聚合函数愉快地接受一个参数列表,并似乎将它们连接为。
所以:
SET @sql = NULL;
SELECT GROUP_CONCAT(
'MAX(CASE WHEN tTYPES.type=''', tTYPES.type,
''' THEN tPROFILE.value ELSE 0 END) AS `', tTYPES.type, '`'
) INTO @sql
FROM tTYPES;
SET @sql = CONCAT('select tUSER.*, ', @sql, '
from tUSER
left join tPROFILE on tPROFILE.tUSER_id = tUSER.id
left join tTYPES on tPROFILE.tTYPES_id = tTYPES.id
where tUSER.id = 312'
);
-- debug your query before running it!
-- SELECT @sql;
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;https://stackoverflow.com/questions/64641161
复制相似问题