Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql sql查询的优化_Mysql_Sql - Fatal编程技术网

Mysql sql查询的优化

Mysql sql查询的优化,mysql,sql,Mysql,Sql,我已经创建了一个查询,但是Diee需要很长时间才能获取数据,我不知道它是什么。您可以简化查询或进行优化,使其运行更流畅吗 选择 数字, 总和(价格)作为价格, Pnr, 最大(日期格式(订单日期,%Y-%m-%d%H:%i:%s')作为订单, 艾尔, 是 从…起 订单名称, 用户, 信用卡用户 哪里 日期\u格式(订单日期,“%m%Y”) 及 订单\数据.cid=卡\用户.card\编号 及 订单\数据.cid=卡\用户.card\编号 及 卡与用户之间的订单。有效来自 及 卡\u用户。有效\u

我已经创建了一个查询,但是Diee需要很长时间才能获取数据,我不知道它是什么。您可以简化查询或进行优化,使其运行更流畅吗

选择
数字,
总和(价格)作为价格,
Pnr,
最大(日期格式(订单日期,%Y-%m-%d%H:%i:%s')作为订单,
艾尔,
是
从…起
订单名称,
用户,
信用卡用户
哪里
日期\u格式(订单日期,“%m%Y”)
及
订单\数据.cid=卡\用户.card\编号
及
订单\数据.cid=卡\用户.card\编号
及
卡与用户之间的订单。有效来自
及
卡\u用户。有效\u至
及
card\u user.user\u id=user.user\u id
及
order_data.b输入('1','4')
分组
卡号,
P_NR,
日期格式(订单日期,'%Y%m%d'),
AV,
AK;

谢谢你的回答

首先,这个查询有很多问题,但不是抱怨,只是解释一下,因为你显然是新来的。下面是使用更合适的联接语法重写的原始查询。如何从第一个(左)表到第二个(右)表成为join的“ON”子句

其次,在查询中始终尝试使用table.column或alias.column。那些不知道您的表结构的人可能会猜测源代码。数字是多少。。订单号,信用卡号码,还是其他号码?因为您的GROUP BY子句有卡号。与Pnr、AL、AM类似。这些都没有背景

where子句仅具有表之间的条件(现在移动到各自的JOIN子句中),但没有实际限制,因此您将获得所有记录。您关于信用卡之间“订单”的条款自/至日期有效,我希望并期望所有使用信用卡的购买都在信用卡的有效到期日期内,因此您将获得所有数据

如果您想根据发生的时间获取记录,您希望您的订单日期在某些日期内。。。如订单日期为2019年7月1日或2019年1月1日至6月30日或类似日期。您的时间是获取所有“B类型”的记录(1或4)。我们不知道该类型表示什么,但这是应用筛选的唯一标准

您的分组依据应为“选择(列)”列表中的所有非聚合列


所以,用一个问题来回答。。。我会编辑您的原始帖子,并要求您修复table.columnn或alias.column中缺少的引用,但也要使用简单的英文描述。。你在找什么。我正在寻找X和Y时间段内的所有订单。对于每个人的信用卡号码,最近购买的是什么。希望这个问题能够进一步澄清。

请尝试在问题中只使用英语(即使这是为了感谢我们的回答)今天的提示:始终使用现代、明确的
JOIN
语法。更容易写(没有错误),更容易阅读和维护,如果需要,更容易转换为外部连接!在WHERE子句中执行
DATE\u格式(orderdate,“%m%Y”)
而不将结果与任何内容进行比较有什么意义?@Joop donst
SELECT
      Number,
      SUM(Price) AS PRICE,
      Pnr,
      MAX(DATE_FORMAT(orderdate,'%Y-%m-%d %H:%i:%s')) AS order,
      AL,
      AM
   FROM
      order_data OD
         JOIN card_user CU
            ON OD.cid= CU.card_number
           AND order BETWEEN CU.valid_from
                         AND CU.valid_to
            JOIN user u
               CU.user_id = U.user_id

   WHERE
          DATE_FORMAT(orderdate,'%m%Y')
      AND OD.BTYPE IN ('1','4')
   GROUP BY
      CU.card_number,
      P_NR,
      DATE_FORMAT(orderdate,'%Y%m%d'),
      AV,
      AK;