在一些视频网站(如:优酷、爱奇艺等),都会有筛选功能。
但当我使用这个筛选功能时,发现其只能进行单类型筛选,例如电影类型只能按某一种类型进行筛选。如果想看既是科幻电影又是战争的电影呢?显然单个标签类型筛选是满足不了这个需求的,接下来简要谈谈我的实现方法。
二、SQL实现
这里我们需要建立三张表:标签表、电影表、标签电影关联表。
-- 标签表
create table TEST_LABEL
LABEL_ID VARCHAR2(32) NOT NULL,
LABEL_NAME VARCHAR2(64) NOT NULL
insert into TEST_LABEL(LABEL_ID, LABEL_NAME) values('L10001', '喜剧');
insert into TEST_LABEL(LABEL_ID, LABEL_NAME) values('L10002', '爱情');
insert into TEST_LABEL(LABEL_ID, LABEL_NAME) values('L10003', '战争');
insert into TEST_LABEL(LABEL_ID, LABEL_NAME) values('L10004', '惊悚');
insert into TEST_LABEL(LABEL_ID, LABEL_NAME) values('L10005', '恐怖');
insert into TEST_LABEL(LABEL_ID, LABEL_NAME) values('L10006', '冒险');
-- 视频表
create table TEST_VIDEO
VIDEO_ID INTEGER NOT NULL,
VIDEO_NAME VARCHAR2(64) NOT NULL,
VIDEO_DESC VARCHAR2(2000) NULL
insert into TEST_VIDEO(VIDEO_ID, VIDEO_NAME, VIDEO_DESC) values(1001, '视频一', '视频描述内容');
insert into TEST_VIDEO(VIDEO_ID, VIDEO_NAME, VIDEO_DESC) values(1002, '视频二', '视频描述内容');
insert into TEST_VIDEO(VIDEO_ID, VIDEO_NAME, VIDEO_DESC) values(1003, '视频三', '视频描述内容');
insert into TEST_VIDEO(VIDEO_ID, VIDEO_NAME, VIDEO_DESC) values(1004, '视频四', '视频描述内容');
insert into TEST_VIDEO(VIDEO_ID, VIDEO_NAME, VIDEO_DESC) values(1005, '视频五', '视频描述内容');
-- 视频标签关联表
create table TEST_RELATION
VIDEO_ID INTEGER NOT NULL,
LABEL_ID VARCHAR2(32) NOT NULL
insert into TEST_RELATION(VIDEO_ID, LABEL_ID) values(1001, 'L10001');
insert into TEST_RELATION(VIDEO_ID, LABEL_ID) values(1001, 'L10002');
insert into TEST_RELATION(VIDEO_ID, LABEL_ID) values(1002, 'L10003');
insert into TEST_RELATION(VIDEO_ID, LABEL_ID) values(1002, 'L10007');
insert into TEST_RELATION(VIDEO_ID, LABEL_ID) values(1003, 'L10004');
insert into TEST_RELATION(VIDEO_ID, LABEL_ID) values(1003, 'L10005');
insert into TEST_RELATION(VIDEO_ID, LABEL_ID) values(1003, 'L10006');
insert into TEST_RELATION(VIDEO_ID, LABEL_ID) values(1004, 'L10004');
insert into TEST_RELATION(VIDEO_ID, LABEL_ID) values(1004, 'L10005');
2)SQL实现
我用的数据库为oracle,这里使用oracle的交集intersect实现该功能。
-- 按视频ID排序
select f.VIDEO_ID, f.VIDEO_NAME, f.VIDEO_DESC, e.LABEL_NAME
from (select c.VIDEO_ID, to_char(wm_concat(d.LABEL_NAME)) LABEL_NAME
from (select a.VIDEO_ID
from TEST_RELATION a
where a.LABEL_ID = 'L10004'
intersect
select a.VIDEO_ID
from TEST_RELATION a
where a.LABEL_ID = 'L10005') b
left join TEST_RELATION c
on c.VIDEO_ID = b.VIDEO_ID
left join TEST_LABEL d
on d.LABEL_ID = c.LABEL_ID
group by c.VIDEO_ID) e
left join TEST_VIDEO f
on f.VIDEO_ID = e.VIDEO_ID
order by f.VIDEO_ID desc
-- 按视频标签数排序
select f.VIDEO_ID, f.VIDEO_NAME, f.VIDEO_DESC, e.LABEL_NAME
from (select c.VIDEO_ID,
to_char(wm_concat(d.LABEL_NAME)) LABEL_NAME,
count(c.VIDEO_ID) TOTAL
from (select a.VIDEO_ID
from TEST_RELATION a
where a.LABEL_ID = 'L10004'
intersect
select a.VIDEO_ID
from TEST_RELATION a
where a.LABEL_ID = 'L10005') b
left join TEST_RELATION c
on c.VIDEO_ID = b.VIDEO_ID
left join TEST_LABEL d
on d.LABEL_ID = c.LABEL_ID
group by c.VIDEO_ID) e
left join TEST_VIDEO f
on f.VIDEO_ID = e.VIDEO_ID
order by e.TOTAL desc
-- 使用分组(只写如何筛选出视频ID)
select t1.VIDEO_ID from TEST_VIDEO t1
where t1.VIDEO in ('L1004', 'L1005')
group by t1.VIDEO having count(*) > 1
注:取交集部分可以使用Java根据选择标签数进行拼接。
通过使用取交集的方法获得命中标签的所有视频ID,这样我们就可以根据这些视频ID很容易获取其相关信息了。SQL语句中使用了wm_concat函数,这里可以换成listagg来实现同样的功能。
一、背景在一些视频网站(如:优酷、爱奇艺等),都会有筛选功能。但当我使用这个筛选功能时,发现其只能进行单类型筛选,例如电影类型只能按某一种类型进行筛选。如果想看既是科幻电影又是战争的电影呢?显然单个标签类型筛选是满足不了这个需求的,接下来简要谈谈我的实现方法。二、SQL实现1)建表这里我们需要建立三张表:标签表、电影表、标签电影关联表。-- 标签表create ta...
好了,话不多说,总结结果如下:
1,简单查询:
格式:SELECT 列名1,列名2,… FROM 表名 [WHERE 条件] [ORDER BY 列名 [ASC|DESC]] [LIMIT 起始索引,数据条数];
2,取别名:
SELECT 列名1 AS “别名1”,列名2 AS “别名2”,… FROM 表名;
例子:SELE...
前面讲到的 SQL 查询只包含从一个或多个表中返回数据的单条 SELECT 语句。SQL 也允许执行多个查询(多条 SELECT 语句),并将结果作为一个查询结果集返回,这些组合查询通常称为复合查询。
主要有两种情况需要使用组合查询:
1.对一个表执行多个查询,按一个查询返回数据。
2.从不同的表返回数据。
组合查询使用关键字 UNION,使用 UNION 很简单,所要做的只是给出每条 SELECT 语句,在各条 SELECT 语句之间放上关键字 UNION。
举个例子,我们根据订单的日期将订单归到相应的月
mysql
实现
对商品进行分类,并根据排名占比打
标签
思路理清了思路后,开始动手操作
看到有人在讨论一个
数据库
的题目,看了下,我也不会,于是自己就动手建了个表试起来,题目如下:
1、对产品进行分类,并
实现
小类别内的价格排序,拿到排序的序号
2、知道每个产品小类的总数
3、根据步骤1的序号和总数,计算这个商品在本类别里的排名占比
4、使用case when判断属于的档位
理清了思路后,开始动手操作
1. 先建个表
CREATE TABLE `test_goods` (
`goods_type` va
本文提到的列表来源于一篇文章,文章标题是关系型
数据库
使用者必须知道的一些NoSQL知识。其中总结的九点NoSQL与RDBMS的区别联系非常不错。NoSQLFan为大家翻译在此。
原文链接:NOSQL
DB BASICS FOR THE RDBMS-SAVVY
理解ACID与BASE的区别(ACID是关系型
数据库
强一致性的四个要求,而BASE是NoSQL
数据库
通常对可用性及一致性
CREATE TABLE e1 (m1 int, n1 char(1));
CREATE TABLE e2 (m2 int, n2 char(1));
INSERT INTO e1 VALUES(1, 'a'), (2, 'b'), (3, 'c');
INSERT INTO e2 VALUES(2, 'b'), (3, 'c'), (4, 'd');
连接的本质就是把各个连接表中的记录都取出来依次匹配的组合加入结果集并返回给用户。
连接内部
实现
数据库
E-R图是用来描述
数据库
中数据实体、关系和属性之间关系的一种图形化表示方法。它是
数据库
设计阶段的重要工具,可以帮助开发人员更好地理解和设计
数据库
结构。
E-R图主要由实体、关系和属性三个部分组成。
实体是指
数据库
中的具体事物,如学生、课程、教师等。每个实体都具有一组属性,用来描述该实体的特征。例如,学生实体可以有姓名、学号、年龄等属性。
关系是指不同实体之间的联系。关系可以是一对一、一对多或多对多的。例如,学生和课程之间的关系可以是一对多的关系,一个学生可以选修多门课程,而一门课程可以由多个学生选择。
属性是实体或关系的特征或性质。属性可以是简单属性,即不可再分的属性,也可以是复合属性,由多个简单属性组成。例如,一个学生的姓名、年龄、电话号码等都是学生实体的属性。
通过E-R图,可以清晰地描述
数据库
中实体、关系和属性之间的关系。在E-R图中,实体一般用矩形框表示,关系用菱形表示,属性用椭圆形表示。通过箭头或线段来表示实体之间的关系类型。
例题解析讲解就是通过具体的例子来演示如何使用E-R图进行
数据库
设计。通过解析例题可以了解如何根据需求将实体、关系和属性进行合理的组织和设计。同时,例题解析还可以帮助理解E-R图的绘制规则和表示方法,以及不同类型关系的处理方式。
总的来说,
数据库
E-R图是
数据库
设计的重要工具,通过它可以清晰地描述
数据库
中实体、关系和属性之间的关系。通过例题解析,我们可以更好地理解和应用E-R图进行
数据库
设计。