编写复杂的mysql查询

时间:2012-11-03 02:34:42

标签: mysql

数据库需要跟踪有关网站注册用户及其上传,查看和评分的视频的信息。每个上传的视频都被放入一组预定义的内容类别中。用户可以多次观看同一视频;他们可能会在每次观看视频时对视频给出不同的评分,或者根本不对视频进行评分。

为了赚钱,视频分享服务取决于广告产生的收入。当用户观看视频时,他们通常(但不总是)在视频开始之前显示广告。任何用户都可以创建广告并支付固定的总价格以使其显示指定的次数(所需的观看次数)。广告商可以通过为其广告指定一个或多个内容类别来将他们的广告定向到具有相关兴趣的用户;广告更有可能与所选类别中的视频一起显示。出于会计和统计目的,数据库会跟踪何时显示广告以及用户是否点击广告。

一些上传了许多高质量视频的多产用户可能会被邀请加入收益分享合作伙伴关系,在这种合作关系中,他们可以从上传的视频中显示的广告中获得一小部分收入。

我在MySql中创建了以下数据库:

USERS (用户名,密码,名称,电子邮件,date_registered)

画 (VIDEO_ID,标题,uploaded_by,UPLOADED_AT,类别)

ADVERTISEMENTS (ad_id,广告客户,价格views_wanted)

Ad_Target_Categories (ad_id,类别)

视图 (用户,视频,viewed_at,等级,ad_shown,ad_clicked)

PARTNERS (用户名,REVENUE_SHARE)

我使用SQL语句创建了数据库:

create table Users
(
username varchar(400) not null,
password varchar(400) not null,
name varchar(400) not null,
email varchar(400) not null,
date_registered date,
primary key(username)
);

create table Videos
(
video_id varchar(400) not null,
title varchar(400) not null,
uploaded_by varchar(400) not null,
uploaded_at varchar(400) not null,
category varchar(400) not null,
primary key(video_id),
foreign key(uploaded_by) references Users(username)
);

create table Advertisements
(
ad_id varchar(400) not null,
advertiser varchar(400) not null,
price varchar(400) not null,
views_wanted varchar(400) not null,
primary key(ad_id),
foreign key(advertiser) references Users(username)
);

create table Ad_Target_Categories
(
ad_id varchar(400) not null,
category varchar(400) not null,
primary key(ad_id,category),
foreign key(ad_id) references Advertisements(ad_id)
);

create table Views
(
user varchar(400) not null,
video varchar(400) not null,
viewed_at varchar(400) not null,
rating varchar(400) not null,
ad_shown varchar(400) not null,
ad_clicked varchar(400) not null,
primary key(user,video,viewed_at),
foreign key(user) references Users(username),
foreign key(video) references Videos(video_id)
);

create table Partners
(
username varchar(400) not null,
revenue_share varchar(400) not null,
primary key(username),
foreign key(username) references Users(username)
);

0)列出每个广告的广告ID,广告客户名称和电子邮件,每千次展示费用(每千次展示费用,每千次观看视图所需的价格)不到7美分。

此查询是否正确:?

select *from ad_id,advertiser,email
from advertisements,users
where price <0.07;

考虑到上述数据库,我希望能够帮助编写以下SQL查询

1)查找针对每个类别的所有广告的总价。 (针对多个类别的广告将计入其所针对的每个类别。)

2)列出所有广告中至少有一个广告的显示次数超过其要求的次数。每个广告客户不应多次列出。

3)找到2012年6月收入最高的三个合作伙伴。列出他们的名字和2012年6月的收入。合作伙伴根据其收入分成和每个广告显示的基础付费。

4)查找自上传后的前两周内未收到任何观看的所有视频。对于每个此类视频,请提供上传该视频的上传用户的名称,视频标题以及上传的日期和时间。

5)首先按照向最新成员注册的日期顺序列出所有用户的名称。对于已上传至少一个视频的用户,还要提供他们观看次数最多的视频的观看次数。

6)找到平均评分最低的五个视频,尽管他们已经被他们自己的上传者评为最高评分5.列出他们的视频ID,标题和平均评分。

1 个答案:

答案 0 :(得分:2)

回答你的问题“这个查询是否正确”,我注意到查询根本不会运行,因为中间有一个额外的FROM卡。

一旦你开始运行,确定它是否正确的技术就是在表格中插入一组行(比如说10或20),这些行包含你能想到的每个边缘情况(超过数量,少于比金额,完全等于金额),以便事先知道正确的返回行集。然后,运行您的查询并与预期输出进行比较。

我还建议您对列数据类型进行更多考虑,而不是将它们全部变为VARCHAR。您会看到有几种类型更适合存储金额。使用VARCHAR,您可能会得到一些产生错误结果的比较异常。

相关问题