从访问到 MySQL 的 SQL 查询转换


SQL Query conversion from Access to MySQL

我有一个用JavaScript/HTML编写的应用程序,它利用本地机器数据库。这是一个非常复杂的问题,但我现在只需要SQL查询的帮助。有关本地 JavaScript 数据库类的更多信息,请参见:JavaScript Access 数据库类

数据由 3D 值和时间分量组成,因此数据库非常大,尽管我将数据从 200 个时间步长简化为 3 个进行测试。 有多个描述 3D 模型的值,因此我使用下拉列表访问不同的值。不幸的是,我没有可以向任何人展示的工作版本,因为它仅适用于本地机器。我正在尝试将此版本转换为运行MySQL的Web样式数据库驱动的演示。 我在FatCow主持,如果你认识他们,你就知道他们有一个php驱动的MySQL接口。

数据设置

数据的设置方式,我有几列描述 3D 数据表,如下所述。这是针对一个名为"dat"的表:

    单元格
  • (矩阵中该单元格的唯一编号(
  • XVal(这是矩阵中的X位置(
  • YVal(这是矩阵中的 Y 位置(
  • 提升(这是矩阵中的 Z 位置(
  • Oct-97(这是具有值的三个时间分量之一(
  • Oct-07(这是具有值的三个时间分量之一(
  • Oct-17(这是具有值的三个时间分量之一(

有几个表被调用来制作网格,但现在让我们只关注"dat"表

一些数据表的设置与引用XVal和YVal类似,但有些仅引用唯一的Cell值。 对于当前应用程序,我获取大列数据并执行转换数据透视表以创建模型的网格。 3D 矩阵网格为 36x41x15。这些网格显示为:

  • XY 平面视图
  • XZ 横截面
  • YZ 横截面

对于在本地应用程序中工作的每个网格,我有三个SQL查询,但这些查询在MySQL中不起作用。 请记住,我正在自学如何做这些事情,所以我有点缺乏经验。如果这是一个明显的错误,请不要杀我。

在本地应用程序上工作的 SQL 查询

对于上述三个查询,以下是有效的方法:

  • XY网格:TRANSFORM ROUND(max(dat.[Oct-07]) *100,2) SELECT dat.Yval FROM dat WHERE (((dat.Lift)=7)) GROUP BY dat.Yval ORDER BY dat.Yval DESC , dat.Xval PIVOT dat.Xval;

  • XZ 网格:TRANSFORM ROUND(max(dat.[Oct-07]) *100,2) SELECT dat.Lift FROM dat WHERE (((dat.Yval)=20)) GROUP BY dat.Lift, dat.Yval ORDER BY dat.Lift DESC PIVOT dat.Xval;

  • YZgrid:TRANSFORM ROUND(max(dat.[Oct-07]) *100,2) SELECT dat.Lift FROM dat WHERE (((dat.Xval)=20)) GROUP BY dat.Lift ORDER BY dat.Lift DESC , dat.Yval DESC PIVOT dat.Yval;

应用程序调用需要显示的 XVal、YVal 或 Lift。因此,在 XY 网格中,[Oct-07] 是查询中的一个变量,就像 dat 一样。提升(从 1 到 15 的数字(。

同样,在其他两个网格中,[Oct-07] 是查询中的一个变量,就像 dat 一样。是的还是哒。分别是十五。

将数据导入MySQL后,我尝试运行这些查询,但它们给出了错误:

MySQL said: Documentation
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'TRANSFORM ROUND( max( dat . [ Oct - 07 ] ) * 100 , 2 ) SELECT dat . Yval FROM da' at line 1 

我使用 ROUND(MAX(...返回列的每个值并修复小数。

我认为问题出在 TRANSFORM 语句中,但我不确定如何翻译它并获得相同的结果。

问题是,如何将这三个查询从基于 MS Access 的查询转换为基于 MySQL 的查询?

感谢您的帮助和见解

MySQL中没有TRANSFORMTRANSFORM实际上只是一个别名,因此MS Access将为您创建"交叉表"查询,并且您可以使用更少的代码。而是使用 ANSI SQL 方式。

http://www.paragoncorporation.com/ArticleDetail.aspx?ArticleID=25

ANSI SQL 交叉表查询示例:

Example ANSI-SQL Crosstab
SELECT 
    SUM(CASE WHEN purchase_date BETWEEN '2004-08-01' and   '2004-08-31' THEN amount ELSE 0 END) As m2004_08, 
    SUM(CASE WHEN purchase_date BETWEEN '2004-09-01' and   '2004-09-30'  THEN amount ELSE 0 END) As m2004_09,
    SUM(CASE WHEN purchase_date BETWEEN '2004-10-01' and   '2004-10-31' THEN amount ELSE 0 END) As m2004_10, 
SUM(amount) As Total
FROM purchases WHERE purchase_date BETWEEN '2004-08-01' AND '2004-10-31'

您可能需要使用GROUP_CONCAT如果可以使用存储过程,那将是最容易的

以下是在 MySQL 中创建交叉表查询的快速教程:http://www.databasejournal.com/features/mysql/article.php/3855376/All-About-the-Crosstab-Query.htm