乙個檔案和標籤的多對多關係表,求取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鍵永...