起始月和最后一个月之间的月份

bqf10yzr  于 2021-06-17  发布在  Mysql
关注(0)|答案(1)|浏览(392)

我有一张mysql表

species
- id                     INT
- name                   LONGTEXT
- FloweringInitialMonth  INT
- FloweringFinalMonth    INT

有个警告如果 FloweringInitialMonth = 13 以及 FloweringFinalMonth = 13 这意味着这个物种一年四季都在开花。
有没有什么快速的方法来创建和填充一个新的关系表,就像这样:

flowering_species
- species_id       INT
- month            INT

结果如下:

species_id | month
2237       | 6
2237       | 7
2237       | 8
20         | 4
20         | 5
20         | 6
...

(另见:https://imgur.com/a/pzlbbec)
这样我就可以查询特定的物种开花月份或者特定月份开花的物种?
我甚至不知道如何开始做这件事,但我想这必须是一种方式来做它与mysql。。。
非常感谢您的帮助,因为我在这里完全不懂。

vltsax25

vltsax251#

要解决这个问题,你需要创建一个月数表,然后 JOIN 那是给 species 表中列出了每月开花的物种。在dbfiddle的演示中,我创建了一个 VIEW 打电话 flowering_species 然后您可以通过 species_id 或者 month :

CREATE VIEW flowering_species AS
SELECT s.id AS species_id, s.name AS name, m.month AS month
FROM (SELECT 1 AS month UNION SELECT 2 UNION SELECT 3 UNION 
      SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION 
      SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION 
      SELECT 10 UNION SELECT 11 UNION SELECT 12) m
JOIN species s ON m.month BETWEEN s.FloweringInitialMonth AND s.FloweringFinalMonth
               OR s.FloweringInitialMonth AND s.FloweringFinalMonth = 13
ORDER BY species_id, month

示例查询:

SELECT * FROM flowering_species WHERE month = 6
SELECT * FROM flowering_species WHERE species_id = 20

输出(基于您发布的样本数据加上全年开花的测试物种):

species_id  name                    month
1           Test species            6
20          Equisetum palustre      6
314         Holcus annuus           6
1825        Cirsium vuloare         6
2237        Agapanthus africanus    6
3126        Centaurea malacitana    6

species_id  name                    month
20          Equisetum palustre      4
20          Equisetum palustre      5
20          Equisetum palustre      6

相关问题