MySQL 查询:有没有更好的方法来根据birth_date 日期字段获取 X 岁或以上的用户

Posted

技术标签:

【中文标题】MySQL 查询:有没有更好的方法来根据birth_date 日期字段获取 X 岁或以上的用户【英文标题】:MySQL Query: Is there a better way to get users who are X years old or older based on birth_date date field 【发布时间】:2015-12-11 18:55:53 【问题描述】:

我目前将用户的出生日期存储为 DATE 字段,0000-00-00 作为默认值。

例如,我正在使用此查询来获取 30 岁或以上的用户。

SELECT * 
FROM myUsers
WHERE birth_date != '0000-00-00'    
AND DATE(birth_date) < DATE( DATE_SUB( NOW() , INTERVAL 30 YEAR ) ) 
ORDER BY user_id desc LIMIT 0,10

这是获得我想要的正确的 sql 查询吗? (获取 30 岁以上或正好 30 岁的用户)是否可以对其进行改进/优化?

【问题讨论】:

DATE() 禁止使用索引,因此提供范围会更有效 我会为此使用&lt;= - 正如所写,今天是 30 岁生日的人将被排除在外。 @Siyual 这是要执行的另一项操作。这取决于 op 想要什么。 @inetphantom ...获取 30 岁或以上的用户... -- OP 想要什么的要求非常清楚。将&lt; 运算符更改为&lt;= 不会影响查询... @Siyual 获取30岁以上的用户X岁以上的也很清楚,这就是我提到它的原因 【参考方案1】:

这并不总是错误的,但我不喜欢将日期存储为0000-00-00 作为默认值,而是使用 NULL(除非它有特殊含义,并且您必须将其与 NULL 区分开来)。

然后您使用DATE() 函数从日期时间字段中删除时间信息,但由于birth_date 不是日期时间字段,因此没有理由使用它。这可以利用索引(如果存在)。

然后你可以使用这个查询:

SELECT   * 
FROM     myUsers
WHERE    birth_date <= CURRENT_DATE()-INTERVAL 30 YEAR 
ORDER BY user_id DESC
LIMIT 0,10

(如果默认值为 NULL,则无需检查)。只需决定是否要使用 &lt;&lt;=,但我更喜欢后者,因为它会包括生日的人。

在birth_date 和user_id 字段上建立索引是个好主意。

【讨论】:

【参考方案2】:

如果您有 0000-00-00 值,请像这样使用 BETWEEN

SELECT * 
FROM myUsers
WHERE birth_date BETWEEN '0000-01-01' and CURRENT_DATE() - INTERVAL 30 YEAR 
ORDER BY user_id DESC
LIMIT 0, 10

【讨论】:

以上是关于MySQL 查询:有没有更好的方法来根据birth_date 日期字段获取 X 岁或以上的用户的主要内容,如果未能解决你的问题,请参考以下文章

有没有更好的方法来做这些 mysql 查询?

有没有更好的方法来为 MySQL 中的临时表分配权限?

有没有比多个子查询更好的方法来获得这个,也许有更多的连接?

有没有更好的方法来进行这个查询?

有没有更好的方法来编写这个查询

mysql 27 秒查询(haversine vs geomfromtext)...必须是更好的方法