MySQL的。列出范围之间的年份

时间:2014-01-22 22:55:13

标签: php mysql sql mysqli

我做了一些研究,发现这个问题与我想要的相反(他们希望为汽车的完整年份列表创建范围)。

MySQL. Select years range

在我的情况下,我想列出年份,但我的年数在范围内。


更新信息

查询

SELECT make, model, begin_year, end_year, motor
FROM general_information
LIMIT 2;

(我没有在表之间建立关系来减少空间并且具体化)


我的数据(为简单起见,只有两行):

  

|制作|型号| begin_year | end_year |马达|

     

|雪佛兰|骑士| 2002 | 2005年| 4 Cil 2.2 Lts |

     

|福特|探险家| 1995年| 1996年| 6 Cil 3.3 Lts |

     

...

我希望获得看起来像这样的MySQL查询

  

|雪佛兰|骑士| 2002 | 4 Cil 2.2 Lts |

     

|雪佛兰|骑士| 2003年| 4 Cil 2.2 Lts |

     

|雪佛兰|骑士| 2004年| 4 Cil 2.2 Lts |

     

|雪佛兰|骑士| 2005年| 4 Cil 2.2 Lts |

     

|福特|探险家| 1995年| 6 Cil 3.3 Lts |

     

|福特|探险家| 1996年| 6 Cil 3.3 Lts |

我尝试了几个涉及CASE,MIN,MAX的MySQL查询,但这些都没有给出我想要的结果。 我认为答案使用子查询,所以我会继续尝试

提前致谢!

2 个答案:

答案 0 :(得分:2)

如果你真的必须在SQL层中解决这个问题,并且你不能改变你的general_information表模式来规范年份数据,我的建议是引入一个新的year_list表,你可以加入反对。这个表非常简单:

year_value
1900
1901
1902
...
2020

显然你会使用适合你的年份

然后你加入这个表:

SELECT
  gi.make AS make,
  gi.model AS model,
  y.year_value AS model_year,
  gi.motor AS motor
FROM general_information AS gi
INNER JOIN year_list AS y ON y.year_value BETWEEN gi.begin_year AND gi.end_year
ORDER BY make ASC, model ASC, model_year ASC, motor ASC

话虽这么说,我认为只需从主表中删除年份数据并将其放入单独的表中进行加入就会更好。这会产生这样的结构:

general_information
-------------------
id <=  create a new autoincrementing primary key field
make
model
motor

在品牌,型号和电机领域提供唯一索引

general_information_to_years
----------------------------
gi_id <= foreign key to id field in general_information table
year_value

您将在这两列

上提供复合主键

这将代表一个更正确的规范化数据库结构。

查询将如下所示:

SELECT
  gi.make AS make,
  gi.model AS model,
  giy.year_value AS model_year,
  gi.motor AS motor
FROM general_information AS gi
INNER JOIN general_information_to_years AS giy ON gi.id = giy.gi_id
ORDER BY make ASC, model ASC, model_year ASC, motor ASC

答案 1 :(得分:0)

您可以尝试此查询。

   SELECT make,model,begin_year + years.incYears as year,motor
FROM
 (SELECT (y1.value + y2.value + y3.value + y4.value + y5.value) as incYears
  FROM
  (SELECT 0 as value UNION SELECT 1)y1,
  (SELECT 0 as value UNION SELECT 2)y2,
  (SELECT 0 as value UNION SELECT 4)y3,
  (SELECT 0 as value UNION SELECT 8)y4,
  (SELECT 0 as value UNION SELECT 16)y5
  )years
CROSS JOIN general_information
WHERE begin_year+years.incYears <= end_year
ORDER BY make,year

sqlFiddle