【问题标题】:Mysql attendence report creates syntax error on prepare stmtMysql考勤报告在prepare stmt上创建语法错误
【发布时间】:2020-10-15 08:11:18
【问题描述】:

我有两个表:一个只有一个名为 date_range 的日期列表(列名为 Date),另一个名为 wp_wpdatatable_1,其中存储了所有日期(每次练习后,都会为每个玩家创建一行,名称为选手(player)、练习日期(date)、时长(sporttrainingduration)、练习组(practiceheldby)等...

现在我想创建一个报告。

我想在每个月的每一天,第一列中的球员姓名以及球员参加训练的每一天我想列出他参加的训练 (wp_wpdatatable_1.practiceheldby)

-- 1. Create an expression that builds the columns
set @sql = (
    select group_concat(distinct
        concat(
            "max(case when date_range.`date`='", date_range.`Date`, "' then `practiceheldby` end) as `", date_range.`Date`, "`"
        )
    )
    from wp_wpdatatable_1, date_range  
    where date_range.`Date`>=2019-06-01
              and date_range.`Date` <= 2019-06-07
);

-- 2. Complete the SQL instruction
set @sql = concat("select `player`, ", @sql , " from wp_wpdatatable_1 group by `player`");

-- 3. Create a prepared statement
PREPARE stmt from @sql;

-- 4. Execute the prepared statement
execute stmt;
DEALLOCATE PREPARE stmt;

我不是职业玩家,我已经玩了 3 到 4 天了。我认为我非常接近,但我收到此错误消息:

从@sql 准备 stmt MySQL 融合:文档

#1064 - SQL 语法中的 Fehler。 Bitte die korrekte Syntax im Handbuch nachschlagen bei 'NULL' in Zeile 1

我错过了什么? 谢谢!

【问题讨论】:

  • 打印@sql的内容(选择@sql),你会看到生成的sql,你可能会看到错误的原因。
  • 在您的日期加上引号,例如 '2019-06-01''2019-06-07'
  • @tcadidot0 将日期更改为“2019-06-01”有所帮助。现在,什么时候打印 @sql 我得到:选择 player, max(case when date_range.Datum=... 和警告:“警告:#1260 第 13 行被 GROUP_CONCAT() 剪切”@Shadow 谢谢,它可能会引导我找到答案......
  • 如果您在 SO 中搜索此警告,您会找到答案:stackoverflow.com/questions/7208773/…
  • 2019 减 06 减 01 等于 2012

标签: mysql mysql-error-1064


【解决方案1】:

你很亲密。除了日期上缺少引号外,代码第 5 行中的 case when date_range.date 应该是 case when date

-- 0. Toy data
CREATE TABLE date_range  (
  `Date` datetime
);
CREATE TABLE wp_wpdatatable_1  (
  `player` VARCHAR(5),
  `Date` DATE,
  `sporttrainingduration` FLOAT,
  `practiceheldby` VARCHAR(10)
);
INSERT INTO date_range 
VALUES
  ('2019-06-01'),
  ('2019-06-02'),
  ('2019-06-03')
  ;
INSERT INTO wp_wpdatatable_1 
VALUES
  ('AAA','2019-06-01','1','group1'),
  ('AAA','2019-06-02','2','group2'),
  ('AAA','2019-06-03','3','group3'),
  ('AAA','2019-06-04','1','gorup1'),
  ('BBB','2019-06-02','2','group2'), 
  ('CCC','2019-06-03','3','group3')
  ;
select * from date_range;
select * from wp_wpdatatable_1;
date_range
===================
Date
===================
2019-06-01 00:00:00
2019-06-02 00:00:00
2019-06-03 00:00:00

wp_wpdatatable_1
=======================================================
player  Date    sporttrainingduration   practiceheldby
=======================================================
AAA 2019-06-01  1   group1
AAA 2019-06-02  2   group2
AAA 2019-06-03  3   group3
AAA 2019-06-04  1   gorup1
BBB 2019-06-02  2   group2
CCC 2019-06-03  3   group3

下面的更新代码:

-- 1. Create an expression that builds the columns
set @sql = (
    select group_concat(distinct
        concat(
            -- "max(case when date_range.`date`='", date_range.`Date`, "' then `practiceheldby` end) as `", date_range.`Date`, "`"
            "max(case when `date`='", date_range.`Date`, "' then `practiceheldby` end) as `", date_range.`Date`, "`"
        )
    )
    from wp_wpdatatable_1, date_range  
    -- where date_range.`Date`>=2019-06-01
              -- and date_range.`Date` <= 2019-06-07
    where date_range.`Date`>='2019-06-01'
              and date_range.`Date` <= '2019-06-07'
);

输出:

===========================================================================
player  2019-06-01 00:00:00     2019-06-02 00:00:00     2019-06-03 00:00:00
===========================================================================
AAA group1  group2  group3
BBB null    group2  null
CCC null    null    group3

Code here

【讨论】:

    猜你喜欢
    • 2012-02-27
    • 2017-01-01
    • 2019-01-04
    • 2016-07-20
    • 2011-01-07
    • 2013-01-04
    • 1970-01-01
    • 2011-01-23
    相关资源
    最近更新 更多