我需要根据可以购买的月份对产品进行排序。我每年都会在特定月份有库存。
我想标记每个月1 - 12。
要选择要使用的月份,我会键入类似"选择 1,2,11"的内容。但我在同一表中也有使用其他日期的其他产品。
即第 1,5,7 个月。我想避免使用年份和日期格式。
我目前有这种格式的表格。
Object | Month |
Peanut | 1,2,11|
Coconut| 4,5,8 |
这意味着花生将在第 1 个月、第 2 个月和第 11 个月提取。椰子将在第 4、5 和 8 个月提取。
我尝试选择月份作为 ID,但不能在一个产品上有多个 ID。
我已经考虑过 VarChar,但我不确定如何让它工作,以及它是否会很慢。
我正在使用HeidiSQL,以及mySQL。是否有任何替代SQL可以工作?
使用它,但不是最好的方法。 规范化是你的朋友。
SELECT `Object` , `MONTH`
FROM mytable
WHERE
FIND_IN_SET("1",`MONTH`)
OR
FIND_IN_SET("2",`MONTH`)
OR
FIND_IN_SET("11",`MONTH`);
以规范化格式存储对象。记录的唯一性将是要提取的对象和月份。熟悉这种设置需要一些练习,尤其是学习使用日期(请参阅有关日期类型的MySQL文档)。请参阅下面的更新表:
|Object | Date |
|-------- | -------- |
|Peanut | 01-JAN-15|
|Peanut | 01-FEB-15|
|Peanut | 01-NOV-15|
|Coconut | 01-APR-15|
|Coconut | 01-MAY-15|
|Coconut | 01-AUG-15|
请注意,日期数据类型是包含以下信息的信息:
- 世纪
- 年
- 月
- 日
- 小时
- 分钟
- 第二
该列仅以 dd-MON-yy 格式显示。现在,您将能够编写SQL
语句来更有效地聚合数据。限制为 JAN, FEB, NOV
MONTH()
函数的 select 语句如下所示:
select object, date, month(date)
from myTable
where month(date) in (01, 02, 11);
将日期存储为日期将允许您使用日期和时间函数。要了解有关日期和时间函数的更多信息,请查看MySQL文档。
尝试每月存储一行,而不是存储包含月份列表的行:
product | month |
Peanut | 1 |
Peanut | 2 |
Peanut | 11 |
Coconut| 4 |
Coconut| 5 |
Coconut| 8 |
-- What products are available in November?
SELECT product FROM product_month_available WHERE month=11;
笔记:
- 将两列
- 都设为键,或对两列添加唯一约束列,这样您就不会有重复的行。
-
product_month_available.product
通常是包含有效产品列表的product
表的 FK,并且可能关于每个人的其他数据。 - 您还可以添加约束以确保
product_month_available.month
是有效的月份 (1-12)。