Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
mysql-动态列别名_Mysql_Sql - Fatal编程技术网

mysql-动态列别名

mysql-动态列别名,mysql,sql,Mysql,Sql,您好,我有“sql query”来查看上周每个成员完成的作业数量,因此我创建了“sql query”,这是一项非常艰巨的工作,但我想将alise从第一周或第二周更改为本周的数据我的“sql query”是: 我想变成这样的“sql查询”,但mysql给了我错误。那么,到底有没有办法解决这个问题呢 SELECT `staffID`, SUM(if (created_at BETWEEN NOW()-INTERVAL 1 WEEK AND NOW(), 1,0)) AS NOW()-INT

您好,我有“sql query”来查看上周每个成员完成的作业数量,因此我创建了“sql query”,这是一项非常艰巨的工作,但我想将alise从第一周或第二周更改为本周的数据我的“sql query”是:

我想变成这样的“sql查询”,但mysql给了我错误。那么,到底有没有办法解决这个问题呢

SELECT `staffID`,  
 SUM(if (created_at BETWEEN NOW()-INTERVAL 1 WEEK AND NOW(), 1,0)) 
 AS NOW()-INTERVAL 1 WEEK, 
 SUM(if (created_at BETWEEN NOW()-INTERVAL 2 WEEK AND NOW()-INTERVAL 1 WEEK, 1,0)) 
 AS NOW()-INTERVAL 2 WEEK, 
FROM tasks 
WHERE status ='done'
GROUP BY `staffID
sql给我这个信息:

#1064-您的SQL语法有错误;检查与您的MySQL服务器版本对应的手册,以了解要使用的正确语法 近'NOW()-间隔1周


检查它是否工作

在列名中添加了括号

SELECT `staffID`,  
SUM(if (created_at BETWEEN NOW()-INTERVAL 1 WEEK AND NOW(), 1,0)) 
AS (SELECT NOW()-INTERVAL 1 WEEK), 
SUM(if (created_at BETWEEN NOW()-INTERVAL 2 WEEK AND NOW()-INTERVAL 1 WEEK, 1,0)) 
AS (SELECT  NOW()-INTERVAL 2 WEEK), 
FROM tasks where status ='done'
GROUP BY `staffID

答案很简单:这在SQL中是不可能的。列别名是常量。您必须动态创建查询以实现所需:

SET @column_alias1 := NOW() - INTERVAL 1 WEEK;
SET @column_alias2 := NOW() - INTERVAL 2 WEEK;
SET @query := CONCAT('SELECT SUM(...) AS `', @column_alias1, '`, SUM(...) AS `', @column_alias2, '` FROM ...');
PREPARE dynamic_statement FROM @query;
EXECUTE dynamic_statement;

解释一下你遇到了什么问题?现在检查一下,添加了select关键字。还是同样的问题只是一个想法,你会如何为同样的问题提出解决方案,但列数太多?@YehCheez:我自己从来没有遇到过这个问题,因为我使用SQL来实现它:一种给我数据的语言。如果我想在我的应用程序或网站的列标题中显示信息,我不会更改查询,而是使用手头的编程语言(C#,PHP,随便什么)。在极少数情况下,我必须动态创建查询,我也在我的应用程序中借助循环、if/then/else以及我的编程语言提供的任何其他工具来完成这项工作。这是有意义的。编程语言可以比SQL更好地处理这些事情。还请记住,这种方法也可能易于SQL注入。。针对SQL注入的唯一保存方法是使用语法
executeusing@
SET @column_alias1 := NOW() - INTERVAL 1 WEEK;
SET @column_alias2 := NOW() - INTERVAL 2 WEEK;
SET @query := CONCAT('SELECT SUM(...) AS `', @column_alias1, '`, SUM(...) AS `', @column_alias2, '` FROM ...');
PREPARE dynamic_statement FROM @query;
EXECUTE dynamic_statement;