【问题标题】:MYSQL query crashes when used GROUP BY clause [duplicate]使用 GROUP BY 子句时 MYSQL 查询崩溃 [重复]
【发布时间】:2019-04-24 20:43:44
【问题描述】:

MYSQL 查询在本地服务器上运行良好,没有错误。但是在生产服务器上使用时,它崩溃了,我必须重新启动服务器

这是我的 order_table 表结构


item_id | order_id | status_id | date
-------------------------------------------
    1   |     1    |     1     | 2014-01-20
    2   |     1    |     2     | 2014-01-20
    3   |     1    |     3     | 2014-01-20
    4   |     2    |     1     | 2014-01-21
    5   |     2    |     2     | 2014-01-21
    6   |     3    |     1     | 2014-01-21
    7   |     3    |     2     | 2014-01-21
    8   |     3    |     3     | 2014-01-22
    9   |     3    |     4     | 2014-01-22
    10  |     3    |     5     | 2014-01-23
-------------------------------------------

我可以通过下面的查询获得order_id的最新状态

SELECT item_id, order_id, status_id
FROM order_table
WHERE item_id IN (
    SELECT MAX(item_id)
    FROM order_table
    GROUP BY order_id
) 
and status_id = '5' 
order by order_id

上述查询在本地服务器上运行良好,但在生产服务器上崩溃。但是当删除 GROUP BY 时,查询也在生产服务器上成功执行。看起来 GROUP BY 正在产生问题

谁能帮我用另一种方法来用不同的方法获得相同的结果

【问题讨论】:

  • 崩溃是什么意思?它会给出错误消息吗?
  • 我记得昨天的这个问题,您不是使用两个不同的数据库供应商吗?像 MariaDB 和 MySQL?
  • 子查询为什么需要排序&分组?
  • “我修复了数据库。现在我在本地和生产服务器上使用相同的数据库版本 MYSQL。” 很公平,你应该在这个问题中提到这一点.. 就像我在关于性能的问题之前发表评论一样,还应该为问题中涉及的每个表包括一个 EXPLAIN query 输出和一个 SHOW CREATE TABLE table .. 没有这个问题就不清楚了
  • 尝试@Strawberry 的答案IN(SELECT ...) 语法在MySQL 中的优化很糟糕。他在答案中使用的JOIN 语法很可能会优化得更好。

标签: mysql


【解决方案1】:

标准(8 之前)方法如下 - 尽管 WHERE 子句可能(甚至可能)应该在子查询中......

SELECT x.item_id
     , x.order_id
     , x.status_id
  FROM order_table x
  JOIN 
     ( SELECT order_id
            , MAX(item_id) item_id
         FROM order_table
        GROUP 
           BY order_id
     ) y
    ON y.order_id = x.order_id
   AND y.item_d = x.item_id
 WHERE x.status_id = 5 
 order 
    by x.order_id

【讨论】:

  • “虽然 WHERE 子句有可能(甚至可能)应该在子查询中......” 我怎么看不到这样做的(简单)方法y 别名没有限制过滤器,只有它们都依赖于关系? MySQL 不支持LATERAL 连接,除非新的 MySQL 8 更新支持它们?
  • “除非有新的 MySQL 8 更新支持它们” O 它接缝 MySQL 8.0.14+ 现在支持LATERAL 参见manual
  • @Strawberry 谢谢你!!!!......你是一个救生员
猜你喜欢
  • 1970-01-01
  • 2020-01-22
  • 1970-01-01
  • 1970-01-01
  • 2018-02-17
  • 2016-05-09
  • 1970-01-01
  • 2023-04-04
  • 1970-01-01
相关资源
最近更新 更多