【问题标题】:Join two tables with columns of one corresponding to rows of another连接两个表,其中一个的列对应另一个的行
【发布时间】:2014-09-25 22:26:21
【问题描述】:

我有一张表(称为 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 对应 Table1 中 id=1 的电影信息行,Movie2 类似地对应于 id 的电影信息行=2 来自 Table1,依此类推。


第一个问题:如何将整个 Table1 与 Table2 中的单行连接起来? (表 1 中的行对应表 2 中的 MovieN 列)。

结果将是一个完整的 Table1,其中包含来自 Table2 行的值的附加 Ranking 列。例如,在日期=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:日期=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时间段内每部电影的排名变化。

【问题讨论】:

  • @frank-n-stein 不知道 insert 也插入列。

标签: sql database join sqlite


【解决方案1】:

我将首先跳到问题 3,因为设计使问题 1 和 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

【讨论】:

    猜你喜欢
    • 2021-10-27
    • 2018-06-09
    • 1970-01-01
    • 2012-06-10
    • 2023-03-19
    • 1970-01-01
    • 2016-08-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多