我有一个电影数据库,我想要列出当年没有电影的年份。所以我只需要一个列表(1900 .. 2012),然后我就可以加入和加入而不是加入。
我有:
CREATE PROCEDURE build_years(p1 SMALLINT) BEGIN CREATE TEMPORARY TABLE year (year SMALLINT(5) UNSIGNED); label1: LOOP INSERT INTO year VALUES (p1); SET p1 = p1 + 1; IF p1 > 2012 THEN LEAVE label1; END IF; END LOOP; END
但这似乎是非SQL的,并且与运行Python代码来创建同一张表相比,仅略微减少了麻烦。我真的很喜欢那些不使用存储过程,不使用循环并且不使用实际表的东西,以这种关注的顺序。
几年前我也遇到过类似的问题。我的解决方案是:
1.顺序表
我创建了一个表格,该表格充满了从0到<所需的整数序列>>:
CREATE TABLE numbers (n INT); INSERT INTO numbers VALUES (0),(1),(2),(3),(4); INSERT INTO numbers SELECT n+5 FROM numbers; INSERT INTO numbers SELECT n+10 FROM numbers; INSERT INTO numbers SELECT n+20 FROM numbers; INSERT INTO numbers SELECT n+40 FROM numbers; etc.
它仅执行一次,因此可以从您的应用程序外部创建,甚至可以手动创建。
2.选择所需类型和范围的数据
对于整数,这很明显-即范围1..99:
SELECT n FROM numbers WHERE n BETWEEN 1 AND 99;
日期-从现在到+2天,间隔2小时:
SELECT date_add(now(),INTERVAL 2*n HOUR) FROM numbers WHERE n BETWEEN 0 AND 23;
因此,在您的情况下,可能是:
SELECT n+1900 AS n_year FROM numbers WHERE n BETWEEN 0 AND 112;
然后JOIN就可以了n_year。
JOIN
n_year