原創 資料庫求交集怎麼做?

2022-09-14 10:24:09 字數 2972 閱讀 1620

乙個檔案和標籤的多對多關係表,求取tag1,tag2,tag3下的檔案有哪些?

idtag_id

file_id

1tag_1f12

tag_2f13

tag_3f14

tag_1f25

tag_2f26

tag_3f37

tag_1

f3例如,求取符合 tag_1 和 tag_2 下面的所有檔案。通過觀察可以發現是f1和f3符合要求。因為f3包含標籤,tag_1, tag_2, tag_3,f1包含tag_1, tag_2, tag_3,f2包含tag_2。因此f1,f3符合要求。

求取交集的辦法有很多,課本上講過的求取交集的辦法就是使用 intersect,然後求取交集。但是很多dbms並不支援這種求取交集的辦法,那該怎麼辦?下面細細分析一波。

按照直覺來看,求取tag_1的檔案:f1, f3。求取tag_2的檔案:f1, f2,f3。最後得到的結果求交集,得到檔案id結果f1, f3。

select file_id

from tag_label

where tag_id = 'tag_1'

intersect

select file_id

from tag_label

where tag_id = 'tag_1';

因為交集操作這個關鍵字並不是所有的dbms都擁有的,所以,在mysql可以使用連線查詢的方式來達到求取交集的目的。

tag_1和tag_2連線操作

select tag_1.`file_id` t1_f, tag_2.`file_id` t2_f

from (select * from `tag_file` where `tag_id` = 'tag_1') tag_1

left join (select * from `tag_file` where `tag_id` = 'tag_2') tag_2

on tag_1.`file_id` = tag_2.`file_id`;

t1_f

t2_f

f1f1

f2f2

f3null

tag_1和tag_2連線查詢並且新增過濾操作

select tag_1.`file_id`

from (select * from `tag_file` where `tag_id` = 'tag_1') tag_1

left join (select * from `tag_file` where `tag_id` = 'tag_2') tag_2

on tag_1.`file_id` = tag_2.`file_id`

where tag_1.`file_id` is not null and tag_2.`file_id` is not null;

file_id

f1f2

使用連線查詢是一件代價很大的查詢操作,雖然可以這種方式可以查詢,但是並不是最好的。第二點,如果有多個標籤id需要構建,那麼就需要構造乙個很長的sql查詢語句,這樣是一件不優雅的查詢操作。綜上所述,就需要一種新的查詢操作來解決這個問題。

因為這種求取交集的辦法很多dbms並不支援,所以這種方法並不可行,那麼該怎麼辦啊?不如換一種思路,按照檔名(file_id)分組。然後根據標籤的長度來判斷檔案是不是同時屬於這幾個標籤,從而得到檔案id列表。多說無益,不如做幾個實驗。

檢視包含標籤列表的檔案有哪些?

select *

from tag_file

where `tag_id` in ('tag_1', 'tag_2');

id

tag_id

file_id

1tag_1f12

tag_2f14

tag_1f25

tag_2f27

tag_1

f3通過分析這些結果,發現,檔案id一列的結果是,符合tag_1或者符合tag_2的結果,得到了並集的結果。但是想要求交集,又該如何進行?

按照檔案id分組,檢視tag的長度

select `file_id`, count(`tag_id`) tag_count

from tag_file

where `tag_id` in ('tag_1', 'tag_2')

group by `file_id`;

file_id

tag_countf12

f22f31

根據group by的性質,可以知道,group by是按照查詢到的結果集,進行分組,因此可以避免連線查詢的效能損耗。再其次,可以發現乙個規律,因為分組是按照搜尋結果分組,所以tag_count的長度不可能超過,需要查詢的標籤列表的長度的。根據場景也就是,tag_count的結果一定小於等於2,而且長度等於2的結果,一定就是符合所有標籤的。因此可以通過這種方式來將交集求出。

求出符合條件的檔案列表

select `file_id`

from tag_file

where `tag_id` in ('tag_1', 'tag_2')

group by `file_id`

h**ing count(`tag_id`) = 2;

file_id

f1f2

最終通過這種方式求出結果。

利用mybatis構造乙個動態sql:

select `file_id`

from tag_file

where `tag_id` in

#group by `file_id`

h**ing count(`tag_id`) = #;

這種方式主要用於同表以內的交集查詢,但是並不適用廣泛的求交集操作。

沒有原創內容我們怎麼做SEO

現在 已經到了內容為王的時代,當我們seo接到乙個優化單時,沒有原創內容我們怎麼辦?原創內容可以讓 更容易有排名,但是當你面對乙個你不熟悉的行業時,我們怎麼讓我們 也能有好的排名?今天愛煮飯分享自己 入門網 在沒有辦法原創時怎麼取的好排名。入門網註冊日期 2009 7 11 到今天為止收錄情況介紹 ...

資料探勘怎麼做

理解你的資料探勘要解決什麼業務問題 必須從商業或者從業者的角度去了解專案的要求和最終目的,去分析整個問題涉及的資源 侷限 設想,甚至是風險 意外等情況,從業務來到業務中去 重點 在業務理解的基礎上,對掌握的資料要有乙個清晰明確的認識 了解有哪些資料,那些可能對目標有影響的資料,哪些是冗餘資料 哪些是...

資料恢復該怎麼做

資料恢復對於大部分人都是乙個陌生的詞,一但接觸資料恢復就意味著有重要的資料丟失,不得不做資料恢復.但是資料丟失後要該怎麼做,相信很多人沒有清晰的認識.下面我來為大家分析幾種常見的資料丟失後應該如何做.1 檔案誤刪除 誤刪檔案後,檔案所在的盤不能存入任何新的檔案。不管是先刪除到 站還是直接安裝 f鍵永...