首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >动态mysql枢轴表故障

动态mysql枢轴表故障
EN

Stack Overflow用户
提问于 2020-11-02 07:08:43
回答 1查看 70关注 0票数 1
代码语言:javascript
运行
复制
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号或手机号码(CellphonetTYPES表中的一个记录)中获得一个支点表。

我的静态枢轴可以工作,因为我已经填充了表并知道了类型。

代码语言:javascript
运行
复制
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

我需要一个动态枢轴查询,因为我并不总是知道下面的类型是我当前的工作,但它告诉我一个语法错误,我无法解决。

代码语言:javascript
运行
复制
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;

误差

代码语言:javascript
运行
复制
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

欢迎任何帮助或指导。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-02 09:26:31

tTYPE中可能存在与MySQL关键字冲突的类型(例如,number是语言关键字)。您需要使用backticks引用这些标识符。

进一步建议:

我不明白为什么在生成条件表达式的查询中需要表group_concat() (表tPROFILE );显然,在中distinct似乎没有必要

  • I建议对字符串文本使用单引号而不是双引号尽管在MySQL中允许使用单引号,但它偏离了ANSI SQL标准,因为没有附加价值(您只需要正确地转义嵌入的单引号)

  • --在group_concat()中不需要concat();聚合函数愉快地接受一个参数列表,并似乎将它们连接为

所以:

代码语言:javascript
运行
复制
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;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64641161

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档