distinct 和order by 冲突解决方案

在新版的mysql5.7的版本中,如果DISTINCTorder by一起使用将会报3065错误,sql语句无法执行。最新的mysql5.7版本语法比之前5.6版本语法更加严格导致的。DISTINCT和order by都会对数据进行排序操作,所以会产生冲突。

SELECT
 DISTINCT a.title,a.tax_no
FROM
 order_invoice a
LEFT JOIN order_data b ON a.order_id = b.order_id
WHERE
 b.user_id = 166 and  a.state= 20 AND a.head_type=2 ORDER BY a.create_date desc limit 0,3

    解决方法一:

        使用group by 替代 distinct 的去重功能

SELECT c.title as name ,c.taxNo as taxNo FROM (
       SELECT
            a.title as title,a.tax_no as taxNo,max(a.id) as id
            FROM
                order_invoice a
            LEFT JOIN order_data b ON a.order_id = b.order_id
            WHERE
            b.user_id = 166 and  a.state= 20 AND a.head_type=2 GROUP BY a.title,a.tax_no ) c  ORDER BY c.id desc limit 0,3

解决方法二 :

 

        编辑mysql5.7的配置文件,添加配置 sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES,这段代码同时也可以解决mysql5.7中的group by导致的1055错误

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: SQL中的DISTINCTORDER BY可能会冲突,因为它们都可以用于查询结果的排序和去重。当使用DISTINCT时,查询结果将只返回不同的值,而ORDER BY则会按照指定的列对结果进行排序。如果在使用DISTINCT时同时使用ORDER BY,那么查询结果将首先按照指定的列进行排序,然后再进行去重,这可能会导致结果不符合预期。因此,在使用DISTINCTORDER BY时,需要仔细考虑它们的顺序和作用,以确保查询结果正确无误。 ### 回答2: SQL语言中,DISTINCTORDER BY是经常用到的两个关键字。它们分别用于去重和排序操作,但在某些情况下,它们经常会发生冲突。 给定一个示例表格Students,包含学生姓名、班级、分数三列,我们可以通过以下SQL语句查询每个班级的最高分: SELECT DISTINCT Class, MAX(Score) FROM Students GROUP BY Class 在这个SQL语句中,DISTINCT被用来去重,保证每个班级只出现一次。然而,随着班级数量的增加,结果集的大小也会变得更大,这就需要用到ORDER BY来对结果集进行排序,以方便查看。 因此,我们可以加入ORDER BY子句,改写上述SQL语句: SELECT DISTINCT Class, MAX(Score) FROM Students GROUP BY Class ORDER BY Class 然而,这个改写后的语句可能会产生冲突。因为ORDER BY Class会按照Class列的大小对结果进行排序,但是在查询中使用了DISTINCT关键字,它会优先去重,可能会改变结果的排序顺序。 为了解决这个问题,可以使用子查询来达到去重和排序的目的: SELECT Class, Score FROM Students AS s1 WHERE Score = (SELECT MAX(Score) FROM Students AS s2 WHERE s1.Class = s2.Class) ORDER BY Class 这个SQL语句首先通过子查询SELECT MAX(Score) FROM Students AS s2 WHERE s1.Class = s2.Class来找到每个班级的最高分,然后使用WHERE Score =子句来筛选出符合条件的结果。最后再使用ORDER BY子句按照Class列进行排序。 通过这样的方式,我们既避免了DISTINCTORDER BY之间的冲突,也保证了最终结果集正确无误。 ### 回答3: SQL中的DISTINCTORDER BY通常被用于查询数据表中的唯一值和按照特定顺序排列结果。然而,在某些情况下,这两者会产生冲突,可能会导致查询结果的不正确或者不完整。本文将讨论这种情况,并探讨如何解决这个问题。 DISTINCTORDER BY的作用 SQL中的DISTINCT用于查询指定列中不重复的值。比如说,如果我们需要查询一个人员表格中的所有部门名称,DISTINCT可以避免重复的部门名称: SELECT DISTINCT department_name FROM employees; 而ORDER BY用于对查询的结果进行排序,可以按照升序(ASC)或者降序(DESC)排列。比如说,我们可以将查询结果按照员工的入职日期升序排列: SELECT employee_id, hire_date FROM employees ORDER BY hire_date ASC; 通过使用DISTINCTORDER BY,我们可以查询结果中不重复的值,并按照指定顺序进行排列。 冲突的原因 然而,在某些情况下,使用DISTINCTORDER BY可能会产生冲突。这是因为在进行DISTINCT操作时,SQL需要对查询结果进行分组,以便过滤重复的值。而在进行ORDER BY操作时,SQL需要对所有的结果进行排序。这就导致了一种问题:当我们同时使用DISTINCTORDER BY时,SQL需要对结果进行分组和排序,但是分组操作以及排序操作的优先级是不同的。具体而言,分组操作先于排序操作执行。这就可能会导致我们得到的结果并不是我们所期望的结果。接下来,我们通过一个例子来说明这一点。 假设我们有一个订单表格,其中包含订单编号(order_id)、客户编号(customer_id)、订单日期(order_date)以及订单金额(order_total)。我们想查询所有客户的最新订单,并按照订单日期进行降序排列: SELECT DISTINCT customer_id, MAX(order_date) AS latest_order_date FROM orders ORDER BY order_date DESC; 这个查询可能会产生问题,因为DISTINCT的分组操作可能先于ORDER BY的排序操作执行。也就是说,SQL首先会对结果进行分组,然后再进行排序。在这个例子中,分组操作可能会导致一些最新订单的日期被忽略,因为它们被分组到同一个customer_id中。 解决方案 为了解决这个问题,我们可以使用子查询或者临时表的方式来先进行排序,再进行DISTINCT操作。比如说,在上面的例子中,我们可以这样写查询语句: SELECT customer_id, latest_order_date FROM ( SELECT customer_id, MAX(order_date) AS latest_order_date FROM orders GROUP BY customer_id ORDER BY latest_order_date DESC ) AS subquery DISTINCT; 这个查询使用了子查询来先对结果进行排序操作,然后再使用DISTINCT操作。这样,我们就可以得到正确的查询结果了。 结论 SQL的DISTINCTORDER BY操作在某些情况下可能会产生冲突。这是因为在进行DISTINCT操作时,SQL需要对结果进行分组,而在进行ORDER BY操作时,SQL需要对结果进行排序。为了解决这个问题,我们可以使用子查询或者临时表的方式来先进行排序操作,然后再进行DISTINCT操作。这样,我们就可以得到正确的查询结果了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值