Mariadb子查询中LIMIT的行为

这是我的问题。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行没有区别。

回答:

这不是你的问题的真正答案。查看我的其他答案,了解您的查询有何错误以及您对其行为的假设。


我猜你想这是什么,每个名字的最新条目2017年12月12日:

select * 

from

(

select

t.*,

max(date_modified) over (partition by name) as max_date_modified

from t

where name in ('name1', 'name2', 'name3')

and date in (date '2017-12-12')

) numbered

where date_modified = max_date_modified

order by name;

UPDATE:看来MariaDB不支持MAX OVER())。因此请使用ROW_NUMBER代替:

select * 

from

(

select

t.*,

row_number() over (partition by Name order by date_modified desc) as rn

from t

where name in ('name1', 'name2', 'name3')

and date in (date '2017-12-12')

) numbered

where rn = 1

order by name;

以上是 Mariadb子查询中LIMIT的行为 的全部内容, 来源链接: utcz.com/qa/262324.html

回到顶部