mySQL,选择“一月”、“二月”和“十一月”.每年



我需要根据可以购买的月份对产品进行排序。我每年都会在特定月份有库存。

我想标记每个月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)。

最新更新