mysql - MYSQL 日期/时间子查询的语法错误

标签 mysql sql datetime

尝试添加仅显示上一个日历月的记录的子查询。它需要检查的列称为 DateOfCheck,是一个自动时间戳列。

我有这个:

$SelectedMonth = "
  select *
  from   Data_Table
  where  DateOfCheck >= date_sub(curdate(), interval 1 month)
     and DateOfCheck <= date_sub(curdate(), interval 1 day)
";

当我将其放入主查询中时,出现语法错误。

另外,我认为(我是菜鸟)这只是查看从今天开始的最后一个月,当我需要它来查看最后一个日历月时。

我还需要一个单独的子查询来调用当前日历月中的所有记录。

好吧,完整的查询(我知道这可能是非常低效的代码 - 正如我所说,我是一个试图将一些东西拼凑在一起的完全菜鸟!)如下,它工作正常,直到我尝试输入上面的日期子查询。

$Area = $_POST['Area'];
$product = $_POST['Product'];
$AverageScore = ("ROUND(AVG(Score),1)AS 'Avg <br/> Score'");
$AverageAutofails = ("ROUND(AVG(Autofails),1)AS 'Autofails <br/> per Check'");
$ProductTotal = "SELECT (COUNT (CA001Result) from Data_Table WHERE Product ='$product')";




$SelectedMonth = "select * from Data_Table where DateOfCheck >= date_sub(curdate(), interval 1 month) and DateOfCheck <= date_sub(curdate(), interval 1 day)"; 
ECHO $SelectedMonth;

if ($product == "All"){


$CA001 ="ROUND ((SELECT 100 * SUM(IF(CA001Result='Fail', 1, 0)) / COUNT(CA001Result) 
FROM Data_Table
WHERE  Area='$Area'),0) as 'CA<br/>001'";

$CA002 ="ROUND ((SELECT 100 * SUM(IF(CA002Result='Fail', 1, 0)) / COUNT(CA002Result) 
FROM Data_Table
WHERE  Area='$Area'),0) as 'CA<br/>002 '";

$CA003 ="ROUND ((SELECT 100 * SUM(IF(CA002Result='Fail', 1, 0)) / COUNT(CA002Result) 
FROM Data_Table
WHERE  Area='$Area'),0) as 'CA<br/>003 '";

$CA004 ="ROUND ((SELECT 100 * SUM(IF(CA004Result='Fail', 1, 0)) / COUNT(CA004Result) 
FROM Data_Table
WHERE  Area='$Area'),0) as 'CA<br/>004 '";

$CA005 ="ROUND ((SELECT 100 * SUM(IF(CA005Result='Fail', 1, 0)) / COUNT(CA005Result) 
FROM Data_Table
WHERE  Area='$Area'),0) as 'CA<br/>005 '";

$CA006 ="ROUND ((SELECT 100 * SUM(IF(CA006Result='Fail', 1, 0)) / COUNT(CA006Result) 
FROM Data_Table
WHERE  Area='$Area'),0) as 'CA<br/>006 '";

$CA007 ="ROUND ((SELECT 100 * SUM(IF(CA007Result='Fail', 1, 0)) / COUNT(CA007Result) 
FROM Data_Table
WHERE  Area='$Area'),0) as 'CA<br/>007 '";

$CA008 ="ROUND ((SELECT 100 * SUM(IF(CA008Result='Fail', 1, 0)) / COUNT(CA008Result) 
FROM Data_Table
WHERE  Area='$Area'),0) as 'CA<br/>008 '";

$CA009 ="ROUND ((SELECT 100 * SUM(IF(CA009Result='Fail', 1, 0)) / COUNT(CA009Result) 
FROM Data_Table
WHERE  Area='$Area'),0) as 'CA<br/>009 '";

$CA010 ="ROUND ((SELECT 100 * SUM(IF(CA010Result='Fail', 1, 0)) / COUNT(CA010Result) 
FROM Data_Table
WHERE  Area='$Area'),0) as 'CA<br/>010 '";


$CA011 ="ROUND ((SELECT 100 * SUM(IF(CA011Result='Fail', 1, 0)) / COUNT(CA011Result) 
FROM Data_Table
WHERE  Area='$Area'),0) as 'CA<br/>011 '";

$CA012 ="ROUND ((SELECT 100 * SUM(IF(CA012Result='Fail', 1, 0)) / COUNT(CA012Result) 
FROM Data_Table
WHERE  Area='$Area'),0) as 'CA0<br/>12 '";

$CA013 ="ROUND ((SELECT 100 * SUM(IF(CA013Result='Fail', 1, 0)) / COUNT(CA013Result) 
FROM Data_Table
WHERE  Area='$Area'),0) as 'CA<br/>013 '";

$CA014 ="ROUND ((SELECT 100 * SUM(IF(CA014Result='Fail', 1, 0)) / COUNT(CA014Result) 
FROM Data_Table
WHERE  Area='$Area'),0) as 'CA<br/>014 '";

$CA015 ="ROUND ((SELECT 100 * SUM(IF(CA015Result='Fail', 1, 0)) / COUNT(CA015Result) 
FROM Data_Table
WHERE  Area='$Area'),0) as 'CA<br/>015 '";

$CA016 ="ROUND ((SELECT 100 * SUM(IF(CA016Result='Fail', 1, 0)) / COUNT(CA016Result) 
FROM Data_Table
WHERE  Area='$Area'),0) as 'CA<br/>016 '";

$CA017 ="ROUND ((SELECT 100 * SUM(IF(CA017Result='Fail', 1, 0)) / COUNT(CA017Result) 
FROM Data_Table
WHERE  Area='$Area'),0) as 'CA0<br/>17 '";

$CA018 ="ROUND ((SELECT 100 * SUM(IF(CA018Result='Fail', 1, 0)) / COUNT(CA018Result) 
FROM Data_Table
WHERE  Area='$Area'),0) as 'CA<br/>018 '";

$CA019 ="ROUND ((SELECT 100 * SUM(IF(CA019Result='Fail', 1, 0)) / COUNT(CA019Result) 
FROM Data_Table
WHERE  Area='$Area'),0) as 'CA<br/>019 '";

$CA020 ="ROUND ((SELECT 100 * SUM(IF(CA020Result='Fail', 1, 0)) / COUNT(CA020Result) 
FROM Data_Table
WHERE  Area='$Area'),0) as 'CA<br/>020 '";

$CA021 ="ROUND ((SELECT 100 * SUM(IF(CA021Result='Fail', 1, 0)) / COUNT(CA021Result) 
FROM Data_Table
WHERE  Area='$Area'),0) as 'CA<br/>021 '";

$CA022 ="ROUND ((SELECT 100 * SUM(IF(CA022Result='Fail', 1, 0)) / COUNT(CA022Result) 
FROM Data_Table
WHERE  Area='$Area'),0) as 'CA<br/>022 '";

$CA023 ="ROUND ((SELECT 100 * SUM(IF(CA023Result='Fail', 1, 0)) / COUNT(CA023Result) 
FROM Data_Table
WHERE  Area='$Area'),0) as 'CA<br/>023 '";

$CA024 ="ROUND ((SELECT 100 * SUM(IF(CA024Result='Fail', 1, 0)) / COUNT(CA024Result) 
FROM Data_Table
WHERE  Area='$Area'),0) as 'CA<br/>024 '";


$CA025 ="ROUND ((SELECT 100 * SUM(IF(CA025Result='Fail', 1, 0)) / COUNT(CA025Result) 
FROM Data_Table
WHERE  Area='$Area'),0) as 'CA<br/>025 '";

$CA026 ="ROUND ((SELECT 100 * SUM(IF(CA026Result='Fail', 1, 0)) / COUNT(CA026Result) 
FROM Data_Table
WHERE  Area='$Area'),0) as 'CA<br/>026 '";

$CA027 ="ROUND ((SELECT 100 * SUM(IF(CA027Result='Fail', 1, 0)) / COUNT(CA027Result) 
FROM Data_Table
WHERE  Area='$Area'),0) as 'CA<br/>027 '";

$CA028 ="ROUND ((SELECT 100 * SUM(IF(CA028Result='Fail', 1, 0)) / COUNT(CA028Result) 
FROM Data_Table
WHERE  Area='$Area'),0) as 'CA<br/>028 '";

}
else{

$CA001 ="ROUND ((SELECT 100 * SUM(IF(CA001Result='Fail', 1, 0)) / COUNT(CA001Result) 
FROM Data_Table
WHERE  Area='$Area' AND Product = '$product'),0) as 'CA<br/>001 '";

$CA002 ="ROUND ((SELECT 100 * SUM(IF(CA002Result='Fail', 1, 0)) / COUNT(CA002Result) 
FROM Data_Table
WHERE  Area='$Area' AND Product = '$product'),0) as 'CA<br/>002 '";

$CA003 ="ROUND ((SELECT 100 * SUM(IF(CA003Result='Fail', 1, 0)) / COUNT(CA003Result) 
FROM Data_Table
WHERE  Area='$Area' AND Product = '$product'),0) as 'CA<br/>003 '";

$CA004 ="ROUND ((SELECT 100 * SUM(IF(CA004Result='Fail', 1, 0)) / COUNT(CA004Result) 
FROM Data_Table
WHERE  Area='$Area' AND Product = '$product'),0) as 'CA<br/>004 '";


$CA005 ="ROUND ((SELECT 100 * SUM(IF(CA005Result='Fail', 1, 0)) / COUNT(CA005Result) 
FROM Data_Table
WHERE  Area='$Area' AND Product = '$product'),0) as 'CA<br/>005 '";

$CA006 ="ROUND ((SELECT 100 * SUM(IF(CA006Result='Fail', 1, 0)) / COUNT(CA006Result) 
FROM Data_Table
WHERE  Area='$Area' AND Product = '$product'),0) as 'CA<br/>006 '";


$CA007 ="ROUND ((SELECT 100 * SUM(IF(CA007Result='Fail', 1, 0)) / COUNT(CA007Result) 
FROM Data_Table
WHERE  Area='$Area' AND Product = '$product'),0) as 'CA<br/>007 '";

$CA008 ="ROUND ((SELECT 100 * SUM(IF(CA008Result='Fail', 1, 0)) / COUNT(CA008Result) 
FROM Data_Table
WHERE  Area='$Area' AND Product = '$product'),0) as 'CA<br/>008 '";

$CA009 ="ROUND ((SELECT 100 * SUM(IF(CA009Result='Fail', 1, 0)) / COUNT(CA009Result) 
FROM Data_Table
WHERE  Area='$Area' AND Product = '$product'),0) as 'CA<br/>009 '";

$CA010 ="ROUND ((SELECT 100 * SUM(IF(CA010Result='Fail', 1, 0)) / COUNT(CA010Result) 
FROM Data_Table
WHERE  Area='$Area' AND Product = '$product'),0) as 'CA<br/>010 '";

$CA011 ="ROUND ((SELECT 100 * SUM(IF(CA011Result='Fail', 1, 0)) / COUNT(CA011Result) 
FROM Data_Table
WHERE  Area='$Area' AND Product = '$product'),0) as 'CA<br/>011 '";

$CA012 ="ROUND ((SELECT 100 * SUM(IF(CA012Result='Fail', 1, 0)) / COUNT(CA012Result) 
FROM Data_Table
WHERE  Area='$Area'),0) as 'CA<br/>012 '";

$CA013 ="ROUND ((SELECT 100 * SUM(IF(CA013Result='Fail', 1, 0)) / COUNT(CA013Result) 
FROM Data_Table
WHERE  Area='$Area' AND Product = '$product'),0) as 'CA<br/>013 '";

$CA014 ="ROUND ((SELECT 100 * SUM(IF(CA014Result='Fail', 1, 0)) / COUNT(CA014Result) 
FROM Data_Table
WHERE  Area='$Area'AND Product = '$product'),0) as 'CA<br/>014 '";

$CA015 ="ROUND ((SELECT 100 * SUM(IF(CA015Result='Fail', 1, 0)) / COUNT(CA015Result) 
FROM Data_Table
WHERE  Area='$Area'AND Product = '$product'),0) as 'CA<br/>015 '";

$CA016 ="ROUND ((SELECT 100 * SUM(IF(CA016Result='Fail', 1, 0)) / COUNT(CA016Result) 
FROM Data_Table
WHERE  Area='$Area'AND Product = '$product'),0) as 'CA<br/>016 '";

$CA017 ="ROUND ((SELECT 100 * SUM(IF(CA017Result='Fail', 1, 0)) / COUNT(CA017Result) 
FROM Data_Table
WHERE  Area='$Area'AND Product = '$product'),0) as 'CA<br/>017 '";

$CA018 ="ROUND ((SELECT 100 * SUM(IF(CA018Result='Fail', 1, 0)) / COUNT(CA018Result) 
FROM Data_Table
WHERE  Area='$Area'AND Product = '$product'),0) as 'CA<br/>018 '";

$CA019 ="ROUND ((SELECT 100 * SUM(IF(CA019Result='Fail', 1, 0)) / COUNT(CA019Result) 
FROM Data_Table
WHERE  Area='$Area'AND Product = '$product'),0) as 'CA<br/>019 '";

$CA020 ="ROUND ((SELECT 100 * SUM(IF(CA020Result='Fail', 1, 0)) / COUNT(CA020Result) 
FROM Data_Table
WHERE  Area='$Area'AND Product = '$product'),0) as 'CA<br/>020 '";

$CA021 ="ROUND ((SELECT 100 * SUM(IF(CA021Result='Fail', 1, 0)) / COUNT(CA021Result) 
FROM Data_Table
WHERE  Area='$Area'AND Product = '$product'),0) as 'CA<br/>021 '";

$CA022 ="ROUND ((SELECT 100 * SUM(IF(CA022Result='Fail', 1, 0)) / COUNT(CA022Result) 
FROM Data_Table
WHERE  Area='$Area'AND Product = '$product'),0) as 'CA<br/>022 '";

$CA023 ="ROUND ((SELECT 100 * SUM(IF(CA023Result='Fail', 1, 0)) / COUNT(CA023Result) 
FROM Data_Table
WHERE  Area='$Area'AND Product = '$product'),0) as 'CA<br/>023 '";

$CA024 ="ROUND ((SELECT 100 * SUM(IF(CA024Result='Fail', 1, 0)) / COUNT(CA024Result) 
FROM Data_Table
WHERE  Area='$Area'AND Product = '$product'),0) as 'CA<br/>024 '";


$CA025 ="ROUND ((SELECT 100 * SUM(IF(CA025Result='Fail', 1, 0)) / COUNT(CA025Result) 
FROM Data_Table
WHERE  Area='$Area'AND Product = '$product'),0) as 'CA<br/>025 '";

$CA026 ="ROUND ((SELECT 100 * SUM(IF(CA026Result='Fail', 1, 0)) / COUNT(CA026Result) 
FROM Data_Table
WHERE  Area='$Area'AND Product = '$product'),0) as 'CA<br/>026 '";

$CA027 ="ROUND ((SELECT 100 * SUM(IF(CA027Result='Fail', 1, 0)) / COUNT(CA027Result) 
FROM Data_Table
WHERE  Area='$Area'AND Product = '$product'),0) as 'CA<br/>027 '";

$CA028 ="ROUND ((SELECT 100 * SUM(IF(CA028Result='Fail', 1, 0)) / COUNT(CA028Result) 
FROM Data_Table
WHERE  Area='$Area'AND Product = '$product'),0) as 'CA<br/>028 '";



}

if ($product == "All"){
echo SQLResultTable2(" SELECT $SelectedMonth $CA001, $CA002, $CA003, $CA004, $CA005, $CA006, $CA007, $CA008, $CA009, $CA010, $CA011, $CA012, $CA013, $CA014, $CA015, $CA016, $CA017, $CA018, $CA019, $CA020,$CA021, $CA022, $CA023, $CA024, $CA025, $CA026, $CA027, $CA028 FROM Data_Table WHERE Area='$Area' GROUP BY Area");}
else{
    echo SQLResultTable2("SELECT $SelectedMonth, $CA001, $CA002, $CA003, $CA004, $CA005, $CA006, $CA007, $CA008, $CA009, $CA010, $CA011, $CA012, $CA013, $CA014, $CA015, $CA016, $CA017, $CA018, $CA019, $CA020,$CA021, $CA022, $CA023, $CA024, $CA025, $CA026, $CA027, $CA028 FROM Data_Table WHERE Area='$Area' GROUP BY Area");}

?>

感谢任何帮助,干杯!

最佳答案

问题是最终查询将以“SELECT SELECT”开头。你可以像这样组装它:

"SELECT $SelectedMonth, $CA001 ..."

$selectedMonth 开头为:

"select * from Data_Table where ..."

所以你得到:

"SELECT select * from Data_Table where ..."

另一个问题是,这是唯一一个选择多个列的子查询,这使得语法更难集成到如此庞大的查询中。由于您只从一个表中进行选择,因此应该将整个事情重新设计为一个大型的单个 SELECT。这是一个非常简单的想法(一次选择,无子查询):

$cols[] = "ROUND(AVG(Score),1)AS 'Avg <br/> Score'";
$cols[] = "ROUND(AVG(Autofails),1)AS 'Autofails <br/> per Check'";
$cols[] = "(COUNT (CA001Result)";

// Note: %03i will format 3 as 003
$columnFormat = "100 * SUM(IF(CA%03iResult='Fail', 1, 0)) / COUNT(CA%03iResult) AS CA%03i";
for($i = 1; $i <=28; $i++) {
  $cols[] = sprintf($columnFormat, $i, $i, $i);
}

$fieldList = implode(', ', $cols);
$sql = "SELECT " . $fieldList;
$sql .= " FROM Data_table WHERE Area='$Area' AND DateOfCheck BETWEEN CURDATE() - INTERVAL 1 MONTH AND CURDATE() - INTERVAL 1 DAY";
if($product != 'ALL') {
  $sql .= " AND Product = '$product'";
}
$sql .= " GROUP BY Area";

基本原理:上面的代码,用最简单的术语来说,是这样做的:

  1. 构建一个由“列”组成的 PHP 数组来选择 ($cols)
  2. 组装这些列(内爆)
  3. 通过串联适当添加 WHERE ad GROUP BY 子句。

最棘手的部分是 sprintf,it's php manual page 对此有很好的解释。 。本质上,它解析一个字符串并将变量的格式化版本放入其中。 %i 格式说明符表示“此参数将是一个整数”。但是,如果不进行额外处理,您的列别名将为“CA1”而不是“CA001”。幸运的是,sprintf 有我们需要的东西,%03i 说“让 int 至少有 3 位数字宽,并用 0 填充(而不是空格)”。因此,例如:COUNT(CA%03iResult) 当传递 23 时,将得到 COUNT(CA023Result)

强烈建议您考虑将本类(class)用于您的脚本。它的性能要高出几个数量级,并且不太容易出错(例如,由于您的执行 fork 在两个位置,因此当您在其中一个路径中引入 SQL 错误时,您可能不会立即注意到(例如,您的 $product = OP 中的所有查询都缺少另一个查询中的逗号,这是简单的疏忽,但如果您不经常运行自动化测试,则很容易错过)。

关于mysql - MYSQL 日期/时间子查询的语法错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12198478/

相关文章:

php - 如何在 codeigniter 中搜索多个单词?

php - 如何更新表行并在行字段中添加+1?

mysql - 如何将 sql 格式更改为天数而不是数字?

mysql - 我需要查询将表中的每个项目与其他所有项目配对,但仅一次

mysql - 将 MySql 数据导出到 asp.net mvc 中的 excel 表

mysql - 3 个表的 SQL 查询或连接

mysql - SQL - 从具有相同 D.O.B 的不同表的两列中查找行的命令

c# - 如何使用 LINQ 查找 DateTime 的总和

python - 同时按日期和ID分组 Pandas 数据框

php - 更改服务器时区后更新 MySQL 数据库中的时间戳