- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我已经为此苦苦挣扎了一段时间,现在我想弄清楚如何最有效地做到这一点。
问题如下。我在数据库中有针对特定年龄组(例如 10 到 20 岁
或 16 岁以上
进行营销的项目,我需要能够进行如下查询,查找适合 17 岁的商品
这是我的两个最佳想法(但我都不喜欢,因为我认为它们都效率低下)。
有一个 csv 列,其值如 10-20
和 16+
,检索整个列表,并解析它(坏主意,我知道,虽然我在这里没有想法)
有一个 csv 列,其值如 10,11,12,13...20
用于范围,因此我可以使用 WHERE ages LIKE "%17"查找它%"
,对于像 16+
这样的情况,我必须使用像 WHERE ages LIKE "%+%"
这样的东西来检索那些特殊情况并解析那些。
我当然倾向于第二种选择,但在最好的情况下,我运行两个查询,一个针对常规项目,另一个针对 16+
有没有更好的方法?如果不是,您认为您可以使我的任何一个模型更有效率吗?谢谢。
最佳答案
你可以这样做:
lower_age
和 upper_age
列添加到您的表中,这两个整数都允许 NULL。lower_age
为 NULL,则没有下限。upper_age
为 NULL,则没有上限。为了澄清 (4),您想这样说:
select *
from your_table
where $n between coalesce(lower_age, $n) and coalesce(upper_age, $n)
其中 $n
是您要查找的年龄。 BETWEEN 使用包含边界,所以 coalesce(lower_age, $n)
忽略 $n
如果 lower_age
不为 NULL 并给你 $n > = $n
(即在该边界上自动为真)如果 lower_age
为 NULL; upper_age
也是如此。
如果某些东西只适合 11 岁的 child ,那么您的 [lower_age,upper_age]
闭区间将是 [11, 11]
,16+ 将是 [16, NULL]
,6 及以下将是 [NULL, 6]
,每个人都是 [NULL, NULL]
,没有人会是[23, 11]
或任何其他具有 lower_age > upper_age
的内容(或者更可能是 CHECK 约束会引发嘶嘶声的无效数据)。
关于sql - 用于搜索我的年龄组的数据库架构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8441388/
我是一名优秀的程序员,十分优秀!