mySQL,选择1月,2月和11月。每年

时间:2016-03-08 12:32:07

标签: mysql sql

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

我想每个月标记1到12个。

要选择我想要使用的月份,我会输入类似于选择1,2,11的内容。 但我也在同一个表中使用其他日期的其他产品。

I.E月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?

3 个答案:

答案 0 :(得分:0)

你可以使用它,但不是最好的方法。规范化是你的朋友。

SELECT `Object` , `MONTH`
FROM mytable
WHERE
  FIND_IN_SET("1",`MONTH`)
OR
  FIND_IN_SET("2",`MONTH`)
OR
  FIND_IN_SET("11",`MONTH`);

答案 1 :(得分:0)

以标准化格式存储对象。记录的唯一性将是对象和提取月份。对这种设置感到满意需要一些练习,尤其是学习使用日期(参见MySQL documentation on DATE types)。请参阅下面的更新表:

|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 docs

答案 2 :(得分:0)

不是存储包含月份列表的行,而是尝试每月存储一行:

sqlContext.read.format("jdbc").options(Map(
  "url"     -> "xxxx",
  "dbtable" -> "(SELECT * FROM xxx LIMIT 4) tmp",
))

注意:

  • 将两列都设为键,或者在两者上添加唯一约束 列,以便您不会有重复的行。
  • 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表的FK,并且可能是 关于每一个的其他数据。
  • 您还可以添加约束以确保 product是有效月份(1-12)。