mysql - phpMyAdmin 错误代码 : 504 with MySQL Query

标签 mysql phpmyadmin

总的来说,我对 SQL 还很陌生。我正在 phpMyAdmin 中尝试以下查询。

SELECT i.`ITEM_NO` as SKU, 
   i.`DESCR` as Description, 
   (SELECT SUM(`QTY_SOLD`) 
           FROM `ps_tkt_hist_lin` 
           WHERE `ITEM_NO` = i.`ITEM_NO` 
              AND `BUS_DAT` >= MAKEDATE(YEAR(CURDATE()),1)
              ) as 'QTY Sold YTD',
   (SELECT SUM(`QTY_SOLD`) 
           FROM `ps_tkt_hist_lin` 
           WHERE `ITEM_NO` = i.`ITEM_NO` 
              AND `BUS_DAT` >= DATE_SUB(DATE_SUB(CURDATE(),INTERVAL (DAY(CURDATE())-1) DAY), INTERVAL 1 MONTH)
              ) as 'QTY Sold Last Month',
   (SELECT SUM(`QTY_ON_HND`) 
           FROM `IM_INV` 
           WHERE `ITEM_NO` = i.`ITEM_NO` 
              AND `LOC_ID` IN ('SL','S','LO','AF')
              ) as 'QTY on Hand'
FROM `ps_tkt_hist_lin` as i
WHERE i.`ITEM_VEND_NO` = 'MD'
GROUP BY i.`ITEM_NO`, i.`DESCR`
ORDER BY i.`ITEM_NO`

运行时出现以下错误。

Error in processing request
Error code: 504
Error text: Gateway Time-out (rejected)
It seems that the connection to server has been lost. Please check your network connectivity and server status.

如果有帮助,这是服务器信息:

Server: Localhost via UNIX socket
Server type: MariaDB
Server version: 10.1.31-MariaDB - MariaDB Server
cpsrvd 11.68.0.29
Database client version: libmysql - 5.1.73
PHP version: 5.6.30

预先感谢您耐心地帮助一个刚刚开始使用 SQL 和 MySQL 的人。

最佳答案

您看到的错误消息可能是由多种不同的原因引起的。一种可能性可能是所涉及的表非常大,并且查询花费的时间太长。大型表可能成为性能 killer 的原因是您的 select 子句中有几个相关的子查询。

一种解决方法是将相关子查询替换为与非相关子查询的适当联接:

SELECT
    i.ITEM_NO AS SKU,
    i.DESCR AS Description,
    COALESCE(t1.qty_sold_ytd, 0) AS qty_sold_ytd,
    COALESCE(t1.qty_sold_last_month, 0) AS qty_sold_last_month,
    COALESCE(t2.qty_on_hand, 0) AS qty_on_hand
FROM ps_tkt_hist_lin i
LEFT JOIN
(
    SELECT
        ITEM_NO,
        SUM(CASE WHEN BUS_DAT >= MAKEDATE(YEAR(CURDATE()), 1)
                 THEN QTY_SOLD ELSE 0 END) AS qty_sold_ytd,
        SUM(CASE WHEN BUS_DAT >=
                      DATE_SUB(DATE_SUB(CURDATE(), INTERVAL (DAY(CURDATE())-1) DAY),
                               INTERVAL 1 MONTH)
                 THEN QTY_SOLD ELSE 0 END) AS qty_sold_last_month
    FROM ps_tkt_hist_lin
    GROUP BY ITEM_NO
) t1
    ON i.ITEM_NO = t1.ITEM_NO
LEFT JOIN
(
    SELECT ITEM_NO, SUM(QTY_ON_HND) AS qty_on_hand
    FROM IM_INV
    WHERE LOC_ID IN ('SL','S','LO','AF')
    GROUP BY ITEM_NO
) t2
    ON i.ITEM_NO = t2.ITEM_NO
WHERE
    i.ITEM_VEND_NO = 'MD'
ORDER BY
    i.ITEM_NO;

我试图忠实于您原始查询的逻辑,但这并不完全有意义。例如,不清楚为什么要在子查询和外部查询中进行聚合。我的建议是为您提供 ps_tkt_hist_lin 表中的每一行。

关于mysql - phpMyAdmin 错误代码 : 504 with MySQL Query,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49063398/

相关文章:

mysql - 组合按同一列分组的两个 GROUP BY 查询

mysql - phpmyadmin 中出现错误 #1604,在 heidisql 中运行正常

mysql - 成功的 MYSQL 查询未显示在数据库中?

mysql - 由字母和数字组成且递增的 ID 号应使用什么类型

mysql - 如果帖子标题包含文本,则批量向 WordPress 帖子添加分类法

php - 在 phpMyAdmin 中,在 _users 结构中创建新列会导致错误 #1067

php - MySQL 为考勤案例选择行

mysql - SQL 请求被截断

php - "Server sent charset (255) unknown to the client"将 MySQL 字符集设置为 utf8 w/o/etc/my.cnf?

mysql - 无法通过 Apache Isis 创建数据