資料庫百科---實現多標籤篩選
一、背景
在一些視訊網站(如:優酷、愛奇藝等),都會有篩選功能。
但當我使用這個篩選功能時,發現其只能進行單型別篩選,例如電影型別只能按某一種型別進行篩選。如果想看既是科幻電影又是戰爭的電影呢?顯然單個標籤型別篩選是滿足不了這個需求的,接下來簡要談談我的實現方法。
二、SQL實現
1)建表
這裡我們需要建立三張表:標籤表、電影表、標籤電影關聯表。
-- 標籤表
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
注:取交集部分可以使用Java根據選擇標籤數進行拼接。
3)結果
三、總結
通過使用取交集的方法獲得命中標籤的所有視訊ID,這樣我們就可以根據這些視訊ID很容易獲取其相關資訊了。SQL語句中使用了wm_concat函式,這裡可以換成listagg來實現同樣的功能。
相關文章
- Element-UI Table 實現篩選資料功能UI
- js根據input標籤的type屬性篩選元素JS
- Pyqt5 實現多標籤頁面QT
- 易優CMS模板標籤screening文件篩選指定自定義欄位讀取篩選條件
- 直播app原始碼,資料庫多資料來源自動選擇實現APP原始碼資料庫
- Redis多機資料庫實現Redis資料庫
- Flutter實現自定義篩選框Flutter
- KVC原理與資料篩選
- R:SNP資料篩選.R
- django使用多個資料庫實現Django資料庫
- 普通填報表單元格實現資料二次篩選
- 在DataSet資料集中 DataView篩選資料View
- css實現的禁止標籤中內容選中效果CSS
- js實現點選<li>標籤彈出其索引值JS索引
- .net將資料庫中的html標籤展示資料庫HTML
- sessionStorage 能在多個標籤頁之間共享資料嗎?Session
- tp5實現多資料庫查詢資料庫
- Redis 設計與實現 (五)--多機資料庫的實現Redis資料庫
- 海量資料“一鍵篩選”,比Excel還好用的篩選功能,更便捷了!Excel
- 實現多個標籤頁之間通訊的幾種方法
- mybatis 根據多個id查詢資料 foreach標籤MyBatis
- mybatis怎麼實現insert into多個資料-oracle資料庫MyBatisOracle資料庫
- K8S標籤與標籤選擇器K8S
- 在<a>標籤中直接傳遞引數時,多個<a>標籤在點選時會衝突
- 成功實現FaceTime語音,FaceTime影片,FaceTime資料篩選,檢測資料是否開通FaceTime的實現原理
- 用Axure實現對時間段的篩選
- 指標圈選在資料應用平臺的實現指標
- JSP簡單標籤標籤庫開發JS
- 直播平臺製作,Flutter ChoiceChip 用來實現選擇標籤效果Flutter
- 在.net中用資料工廠實現多資料庫的操作方案資料庫
- javascript實現文字框標籤驗證JavaScript
- 使用bringToFont實現標籤切換
- 標籤實現響應式圖片
- JS中的陣列過濾,從簡單篩選到多條件篩選JS陣列
- Sql Server資料庫如何去掉內容裡面的Html標籤SQLServer資料庫HTML
- Excel如何篩選出自己想要的資料 excel怎麼篩選出需要的內容Excel
- excel篩選條件怎麼設定 excel怎麼篩選出自己想要的資料Excel
- JSP標籤庫介紹(1)什麼是標籤庫? (轉)JS