• 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧

Mariadb子查询中LIMIT的行为

sql 来源:Tan Jason 4次浏览

这是我的问题。Mariadb子查询中LIMIT的行为

我不擅长SQL查询,所以我希望能够对LIMIT子句的不同行为有所了解。我有两个疑问。可以说我的表有3列,namedatedate_modified。我每小时修改一次表格,并使用date_modified列对其进行修改。我试图获取针对特定日期2017-12-12修改日期的最后一条记录(最近修改过)。

SELECT * from 
    (SELECT * from table where name in ('name1','name2','name3') 
    and date in ('2017-12-12') order by date_modified desc) 
    as tmp_table group by name 

SELECT * from 
    (SELECT * from table where name in ('name1','name2','name3') 
    and date in ('2017-12-12') order by date_modified desc LIMIT 100) 
    as tmp_table group by name 

第一个返回一个表格,其中修改日期是当天最早的记录。第二个是我想要的,它返回最新修改的数据。如果我有一个更大的表,其中name3是第101条记录,则查询将无法正常工作。所以对LIMIT进行硬编码是不可行的,也是一种不好的做法。

为什么会有差异?按顺序通过在子查询中不工作?

*我只是在我自己想到解决方案时添加更多信息。

加上:上面的子查询具有相同的行为;即数据按照修改日期的降序排序。

date_modifieddate都是日期时间格式。


===========解决方案如下:

表是一组无序的数据。对于派生表(即子查询)也是如此。

首先查询

您从表中选择,责令某些记录。 DBMS可以完全忽略这个ORDER BY子句,因为您只将数据用作子查询。然后按名称分组。现在我们必须区分两种情况:

  1. name + date在表中是唯一的。然后你返回你找到的行。 GROUP BY条款将是多余的。
  2. name + date在表中并不是唯一的。但你select *。这是无效的SQL,因为如果对于一个名称和日期有多个行,则不会告诉DBMS要选择哪个值。如果MariaDB让这个漏洞出现,这是DBMS的一个缺陷。

从您的描述看来,第二种情况适用。您的查询无效。

第二个查询

您以应用LIMIT子句从表中选择,责令某些记录。这限制了结果,但DBMS可以随意以任何顺序输出行,因为您将数据用作子查询。当您订购date_modified时,您可能会丢弃结果中的某些名称(例如,最后的100个记录中的所有名称1和名称2,然后您会忽略名称3。

至于GROUP BY name:我所说的关于第一个查询也适用于此处。您将数据限制为100行没有区别。


版权声明:本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系管理员进行删除。
喜欢 (0)