如何创建此查询(斯坦福大学Database MOOC中包含的练习):
对于同一个审阅者对同一部电影进行了两次评级,第二次评级更高的所有情况,返回审阅者的姓名和电影的标题。
使用的系统是SQLite。
表movie
:
| 现场|类型|零|钥匙|默认|额外的|
| - -----|- -----|- -----|- -----|- -----|- -----|
| mID| int(11)|是的||空值||
| 标题|正文|是的||空值||
| 年|int(11)|是的||空值||
| 导演|正文|是的||空值||
表rating
:
| 现场|类型|零|钥匙|默认|额外的|
| - -----|- -----|- -----|- -----|- -----|- -----|
| RID| int(11)|是的||空值||
| mID| int(11)|是的||空值||
| 恒星|int(11)|是的||空值||
| 评级日期|日期|是的||空值||
表reviewer
:
| 现场|类型|零|钥匙|默认|额外的|
| - -----|- -----|- -----|- -----|- -----|- -----|
| RID| int(11)|是的||空值||
| 姓名|正文|是的||空值||
预期结果:
| 姓名|标题|
| - -----|- -----|
| 莎拉·马丁内斯|乱世佳人|
The data。
3条答案
按热度按时间qacovj5a1#
我不是100%确定SQLite是否允许
ON
子句包含EXISTS
表达式。如果没有,您可以将EXISTS
表达式移动到WHERE
子句中,并在reviewer
和movie
之间执行交叉连接。如果SQLite不支持
EXISTS
,则将EXISTS
查询作为派生表放在FROM
子句中,其中两个表INNER JOIN
彼此相连,然后GROUP BY
mId
和rID
,然后INNER JOIN
到主表。它可能看起来像这样:我希望您能看到这两个查询如何表达相同的语义。在一个非常大的数据库中,人们对同一部电影进行了多次评级,可能会有性能差异(我首先展示的
EXISTS
版本可以表现得更好,因为它可以在找到一个结果时立即停止)。注意:您可以将整个混乱的查询连接到一个查询中,然后
GROUP BY
name
,title
,rID
,mID
,但是虽然“更简单”,但这将是更错误的,因为不需要为许多行复制名称和标题,只需要通过分组丢弃这些信息。分组应尽早进行。du7egjpx2#
我已经成功地解决了这个特定的练习与此查询:
它返回评论者对同一部电影进行过多次评级的地方,以及最后一次(不具体是第二次)评级更高的时间。
yhxst69z3#
也试试这个:
我遵循了简单的分析方法,得到了正确的答案。