我有一个 MySQL 数据库表,其中一个单元格包含多个日期,我想选择包含一个或多个日期大于今天日期的单元格的所有行,这可能吗?(使用 PHP)
4 回答
当然:
select * from MyTable where MyDate > Now()
您的单个字段如何包含多个日期?也许您应该为此考虑一个单独的表。
“单个单元格包含多个日期”.. 是问题的症结所在。这里有三个选项。
规范化/修复架构
从一个充分规范化的模式开始 - 特别是,任何列/“单元格”最多可以有一个日期(或一条信息)。根据信息的作用,这可能需要也可能不需要引入另一个表。
这种方法是可扩展的,并且在 RDMBS/RA 设计中工作,如果完成,其他查询将“正常工作”。
(这是迄今为止总体上最好的选择,如果可能的话,应该这样做。适当的规范化还应该指导进一步的模式开发,以在未来缓解此类问题。)
创建标准化视图
创建可以JOIN
编辑的非规范化表(或此类规范化查询)的规范化视图。然后使用各种建议的答案之一(适用于规范化模式)..尽管存在无法利用索引的极端劣势。
这非常混乱,但可以做到。看到SELECT 非规范化列到单独的记录中吗?例如。(注意这里合成的行关系,虽然一些[非 MySQL] 数据库也支持表值函数和此类的跨应用程序。)
这种方法无法扩展,因为它不能使用索引。
在客户端过滤(PHP)
获取每一行。循环和使用explode
等,视情况而定。
由于缺少索引并且需要在本地获取所有数据,这种方法无法扩展。
虽然可以通过各种技巧(例如FIND_IN_SET
)在非规范化列中找到相等的值,但使用相同的技术无法找到相对(即更大/更小)的值。在这两种情况下都有效的解决方案是修复底层架构。
如果该字段是 aDATE
或者DATETIME
您可以使用
SELECT * FROM table WHERE datefield > NOW()
如果你只在 aDATE
而不是 aDATETIME
你可以使用CURDATE()
而不是NOW()