从MS Access转换为mySQL

时间:2014-11-09 12:07:31

标签: mysql

我正在使用Prestashop 1.6.0.6,它似乎有一个错误,随机虚拟产品文件消失,不再可供下载,需要重新上传。所以我正在尝试编写一个查询,显示所有具有虚拟产品的活动产品以及该虚拟产品是否处于活动状态。在某些情况下,因为我已经第二次上传虚拟产品是活动的可以是0或1,通过总结,我可以获得最终的活动状态。

我找到了编写查询所需的所有表格;

ps_product_lang->id_product
ps_product_lang->name

ps_product->id_product
ps_product->is_virtual
ps_product->active

ps_product_download->id_product
ps_product_download->display_filename
ps_product_download->filename
ps_product_download->active

我限制了mySQL查询知识,因此通常在MS Access中编写查询然后使用SQL视图并复制到mySQL,通常它只需稍加调整即可。在这个例子中,我使用分组,首先和求和(虚拟产品是活动的),并且无法使查询起作用。我一直在收到语法错误。这是我正在使用的查询;

SELECT ps_product_lang.id_product, 
       First(ps_product_lang.name) AS FirstOfname, 
       First(ps_product.is_virtual) AS FirstOfis_virtual, 
       First(ps_product.active) AS FirstOfactive, 
       First(ps_product_download.display_filename) AS FirstOfdisplay_filename, 
       First(ps_product_download.filename) AS FirstOffilename, 
       Sum(ps_product_download.active) AS SumOfactive
FROM (ps_product 
RIGHT JOIN ps_product_lang ON ps_product.id_product = ps_product_lang.id_product) 
LEFT JOIN ps_product_download ON ps_product.id_product = ps_product_download.id_product
GROUP BY ps_product_lang.id_product
HAVING (((First(ps_product.is_virtual))=1) AND ((First(ps_product.active))=1));

任何有助于查询工作的帮助都将不胜感激。

1 个答案:

答案 0 :(得分:2)

首先,使用表别名重写查询并修复from子句中的外连接。我发现很难理解查询混合外连接类型的逻辑。因为查询在product子句的having表中有列,所以第一次连接实际上是内部连接。并且,因为第二个连接使用产品表而不是产品lang表,所以这也是内连接。这是您的查询结构:

SELECT p.id_product, 
       First(l.name) AS FirstOfname, 
       First(p.is_virtual) AS FirstOfis_virtual, 
       First(p.active) AS FirstOfactive, 
       First(pd.display_filename) AS FirstOfdisplay_filename, 
       First(pd.filename) AS FirstOffilename, 
       Sum(pd.active) AS SumOfactive
FROM ps_product_lang l JOIN
     ps_product p
     ON p.id_product = l.id_product JOIN
     ps_product_download pd
     ON p.id_product = pd.id_product
GROUP BY l.id_product
HAVING First(p.is_virtual) = 1) AND First(p.active) = 1;

我不完全了解数据结构。如果我假设product.id_product是一个唯一键(这将是一个正常的命名约定),那么你不需要对该表的任何聚合函数。但是,您的问题表明这不是唯一的。

您可以使用MySQL中的技巧实现first,结合substring_index()group_concat()

但是,为了让您入门,我认为group_concat()可能会更有帮助。所以,我建议您从这个查询开始:

SELECT l.id_product, 
       group_concat(l.name) AS allnames, 
       group_concat(p.is_virtual) AS allis_virtuals, 
       group_concat(p.active) AS allactives, 
       group_concat(pd.display_filename) AS alldisplay_filenames, 
       group_concat(pd.filename) AS allfilenames, 
       Sum(pd.active) AS SumOfactive
FROM ps_product_lang l JOIN
     ps_product p
     ON p.id_product = l.id_product JOIN
     ps_product_download pd
     ON p.id_product = pd.id_product
GROUP BY l.id_product
HAVING SUM(p.is_virtual = 1) > 0 AND SUM(p.active = 1) > 0;

如果这不符合您的要求,那么您应该能够调整它。