【问题标题】:SQL Database - FIRST OperandSQL 数据库 - 第一个操作数
【发布时间】:2015-03-19 19:14:08
【问题描述】:

这是我的数据库关系:

节目(showID、标题、premiere_year、网络、创作者、类别)

剧集(节目ID、剧集ID、播出日期、标题)

  • showID 是节目的外键

演员(actID,fname,lname)

main_cast(showID, actID, role)

  • showID 是显示的外键 actID 是演员的外键

recurring_cast(showID, episodeID, actID, role)

showID 是节目的外键 episodeID 是剧集的外键

  • actID 是演员的外键

客户(custID, fname, lname, email, creditcard,membersince,renewaldate, password, username)

cust_queue(custID, showID, datequeued)

  • custID 是客户的外键 showID 是节目的外键

观看(custID、showID、episodeID、观看日期)

  • custID 是客户的外键
  • showID 是节目的外键
  • (showID, episodeID) 是剧集的外键
  • (custID, showID) 是 cust_queue 的外键

所有的“ID”都是主键

我收到了一些疑问,对于某些人来说,我不知道该怎么做。如:

对于每个客户(显示名字和姓氏),显示哪个节目和剧集是该客户观看的第一个节目。按客户姓氏对结果进行排序。

我正在尝试:

{
SELECT FIRST (Watched.datewatched)
FROM Watched
WHERE Watched.datewatched

IN

(SELECT Customer.fname, Customer.lname, Shows.title, Episode.title 
FROM Customer, Shows, Episode, Watched
WHERE Shows.showid = Episode.showID AND Watched.custID = Customer.custID AND Watched.showID = Shows.showid
ORDER BY Watched.datewatched);
}

但我认为这是不对的。有任何想法吗??我想我不知道如何使用“FIRST”操​​作数。

【问题讨论】:

  • 为什么这个标签是php?它还缺少正确的数据库标签 - oracle、sql-server 等。
  • 没有第一个操作数!这就是你不知道如何使用它的原因。
  • 那么如何让客户观看第一场演出?
  • 使用分组依据。在 sql 中,你必须考虑集合而不是函数。

标签: sql database


【解决方案1】:

由于您没有提供平台,我将使用应该适用于大多数(所有)SQL 平台的代码:

以下是解决此类问题的方法,请按步骤进行。首先,我们想知道用户观看的第一期节目和剧集。

查找用户观看的第一个节目

select custID, showID, min(datewatched)
from watched
group by custID, showID

现在获取该节目的第一集

select firstshow.custID, firstshow.showID, firstshow.datewatched, minDW, mineID
from ( 
  select custID, showID, min(datewatched) as minDW
  from watched
  group by custID, showID
) as firstshow
join 
(
  select custID, showID, datewatched, min(episodeID) as mineID
  from watched
  group by custID, showID, datewatched
) as firstepisode on firstshow.custID = firstepisode.custID 
                 and firstshow.showID = firstepisode.showID
                 and firstshow.minDW = firstepisode.datewatched

现在重新加入以获取用户名和显示名称

select customer.fname, customer.lname, shows.Title as show, mineID as EpisodeNum
from ( 
  select custID, showID, min(datewatched) as minDW
  from watched
  group by custID, showID
) as firstshow
join 
(
  select custID, showID, datewatched, min(episodeID) as mineID
  from watched
  group by custID, showID, datewatched
) as firstepisode on firstshow.custID = firstepisode.custID 
                 and firstshow.showID = firstepisode.showID
                 and firstshow.minDW = firstepisode.datewatched
join customer on firstshow.custID = customer.custID
join shows on firstshow.showID = shows.showID
order by customer.lname

如果你循序渐进,即使是这样复杂的事情也可以变得简单。

【讨论】:

  • 这种帮助,但是在你的代码的第二部分,'firstshow'是从哪里来的?
  • firstshow 是答案第一部分中解释的子查询的别名。您可以将其视为使用 select 语句来定义表。
  • @BrettSaguid - 除非您使用 db2、oracle 或 sql server 并且可以使用 OVER () 语句,否则您必须使用子查询来解决此问题。但是,如果您可以使用 over,这将非常容易且“简单”。
  • 抱歉,我的 SQL 非常新,但是您在哪里将代码的第一部分定义为“firstshow”?
  • ()里面的东西——你应该读Sql基础知识,我不会教你cmets中的sql
猜你喜欢
  • 1970-01-01
  • 2016-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-01
  • 2012-10-24
相关资源
最近更新 更多