我有一张桌子(称之为 Table1 ),其中我存储了一些有关电影的信息:
| id | Title | Producer | Released | Actors |
---------------------------------------------
| 1 | Blah1 | Blah1 | Blah1 | Blah1 |
| 2 | Blah2 | Blah2 | Blah2 | Blah2 |
| 3 | Blah3 | Blah3 | Blah3 | Blah3 |
|... | ... | ... | ... | ... |
该表没有问题,这里一切都很好。
问题出在另一个表( Table2 )上。我有一个每天运行一次的脚本,并检查电影网站的电影排名。所以我想记录每天Table1中所有电影的排名。所以我提出了一个看起来像这样的表:
| id | Date | Movie1 | Movie2 | Movie3 | ... |
----------------------------------------------------
| 1 | Aug 1 2014 | 7.1 | 4.3 | 9.6 | ... |
| 2 | Aug 2 2014 | 7.2 | 4.2 | 9.4 | ... |
|... | ... | ... | ... | ... | ... |
该脚本每天运行一次,因此每天都会创建一行排名。 Movie1 对应于表1中 id = 1的电影信息行, Movie2 同样对应于 id 的电影信息行表1中= 2,依此类推。
第一个问题:如何使用Table2中的单行加入整个Table1? (表1中的行对应于表2中的 MovieN 列)。
结果将是整个Table1,其中包含来自Table2行的其他Ranking列。例如,在 Date = 2014年8月2日将Table1与Table2的行连接:
| id | Title | Producer | Released | Actors | Ranking |
-------------------------------------------------------
| 1 | Blah1 | Blah1 | Blah1 | Blah1 | 7.2 |
| 2 | Blah2 | Blah2 | Blah2 | Blah2 | 4.2 |
| 3 | Blah3 | Blah3 | Blah3 | Blah3 | 9.4 |
|... | ... | ... | ... | ... | ... |
第二个问题:如何从第一个问题做同样的事情,但是将Table1与两个Table2行(row2-row1)的差异连接起来,其中row1: Date = 2014年8月1日和第2行:日期 = 2014年8月2日。即:
| id | Title | Producer | Released | Actors | Ranking |
-------------------------------------------------------
| 1 | Blah1 | Blah1 | Blah1 | Blah1 | 0.1 | <-- (7.2 - 7.1)
| 2 | Blah2 | Blah2 | Blah2 | Blah2 | -0.1 | <-- (4.2 - 4.3)
| 3 | Blah3 | Blah3 | Blah3 | Blah3 | -0.2 | <-- (9.4 - 9.6)
|... | ... | ... | ... | ... | ... |
第三个问题:每天我都会在Table1中添加一些新电影。如果我在Table1中添加一个新电影,我将不得不在Table2中插入一个相应的新列。它通常是通过 ALTER SQL命令完成的,但它的效率/设计效率如何呢?
另外,我是SQL数据库的新手,所以如果我的数据库设计不好,请建议一个更好的数据库。请注意,我将使用该数据库来查询Date1和Date2之间所有电影的排名变化,就像在第二个问题中一样,所以每天有一行是有意义的,所以我只能查询2行(一个用于Date1,另一个用于Date2)并相互减去它们以获得Date1-Date2期间每部电影的排名变化。
答案 0 :(得分:1)
我首先要跳到问题3,因为设计提出问题1&amp; 2非常复杂。
创建以下表格
Producers (id,Producer)
Actors (id,Actor)
Movies (id,Title,Released,producer_id)
Movie_Actors (movie_id,actor_id)
Movie_Rankings (id,movie_id,ranking_date,ranking)
现在你可以通过以下方式处理问题1
SELECT id,Title,Released,Producer,ranking,
group_concat(Actor) Actors
FROM Movies m
JOIN Producers p ON m.producer_id = p.id
JOIN Movie_Actors ma ON ma.movie_id = a.id
JOIN Actors a ON a.id = ma.actor_id
JOIN Movie_Rankings mr ON m.id = mr.movie_id
AND mr.ranking_date = '2014-08-02'
GROUP BY m.id
问题2
SELECT id,Title,Released,Producer,
(mr.ranking - mr2.ranking), group_concat(Actor) Actors
FROM Movies m
JOIN Producers p ON m.producer_id = p.id
JOIN Movie_Actors ma ON ma.movie_id = a.id
JOIN Actors a ON a.id = ma.actor_id
JOIN Movie_Rankings mr ON m.id = mr.movie_id
AND mr.ranking_date = '2014-08-02'
JOIN Movie_Rankings mr2 ON m.id = mr2.movie_id
AND mr2.ranking_date = '2014-08-01'
GROUP BY m.id