CREATE TABLE IF NOT EXISTS `all_tag_relations` (
`id_tag_rel` int(10) NOT NULL AUTO_INCREMENT,
`id_tag` int(10) unsigned NOT NULL DEFAULT '0',
`id_tutor` int(10) DEFAULT NULL,
`id_wc` int(10) unsigned DEFAULT NULL,
PRIMARY KEY (`id_tag_rel`),
KEY `All_Tag_Relations_FKIndex1` (`id_tag`),
KEY `id_wc` (`id_wc`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=19 ;
INSERT INTO `all_tag_relations` (`id_tag_rel`, `id_tag`, `id_tutor`, `id_wc`) VALUES
(1, 1, 1, NULL),
(2, 2, 1, NULL),
(3, 6, 2, NULL),
(4, 7, 2, NULL),
(8, 3, 1, 1),
(9, 4, 1, 1),
(10, 5, 2, 2),
(11, 4, 2, 2),
(15, 8, 1, 3),
(16, 9, 1, 3),
(17, 10, 1, 4),
(18, 4, 1, 4),
(19, 1, 2, 5),
(20, 4, 2, 5);
CREATE TABLE IF NOT EXISTS `tags` (
`id_tag` int(10) unsigned NOT NULL AUTO_INCREMENT,
`tag` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id_tag`),
UNIQUE KEY `tag` (`tag`),
KEY `id_tag` (`id_tag`),
KEY `tag_2` (`tag`),
KEY `tag_3` (`tag`),
KEY `tag_4` (`tag`),
FULLTEXT KEY `tag_5` (`tag`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=11 ;
INSERT INTO `tags` (`id_tag`, `tag`) VALUES
(1, 'Sandeepan'),
(2, 'Nath'),
(3, 'first'),
(4, 'class'),
(5, 'new'),
(6, 'Bob'),
(7, 'Cratchit'),
(8, 'more'),
(9, 'fresh'),
(10, 'second');
CREATE TABLE IF NOT EXISTS `webclasses` (
`id_wc` int(10) NOT NULL AUTO_INCREMENT,
`id_author` int(10) NOT NULL,
`name` varchar(50) DEFAULT NULL,
PRIMARY KEY (`id_wc`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;
INSERT INTO `webclasses` (`id_wc`, `id_author`, `name`) VALUES
(1, 1, 'first class'),
(2, 2, 'new class'),
(3, 1, 'more fresh'),
(4, 1, 'second class'),
(5, 2, 'sandeepan class');
關於系統 這些數據 - 該系統由導師和課程。 - 表All_Tag_Relations中的數據存儲每個註冊導師以及由導師創建的每個課程的標籤關係。標籤關係用於搜索課程。
當前的數據轉儲對應於已經創建了類「新班」和「新班」的名爲「第一班」,「更新鮮」,「第二班」和導師「鮑勃克拉奇特」的導師「Sandeepan Nath」 Sandeepan課程「。
我想獲得一個搜索查詢,它對搜索關鍵字執行AND邏輯,並返回每個這樣的類,這些類中的搜索項目在類名或其導師名中出現。
爲了方便,下面是搜索條件的一個例子列表和期望的結果: -
Search term result classes (check the id_wc in the results)**
first class 1
Sandeepan Nath class 1
Sandeepan Nath 1,3
Bob Cratchit 2
Sandeepan Nath bob none
Sandeepan Class 1,4,5
我迄今已達高達該查詢
-- Two keywords search
SET @tag1 = 4, @tag2 = 1; -- Setting some user variables to see where the ids go.
SELECT wc.id_wc, sum(DISTINCT (
wtagrels.id_tag = @tag1
)) AS key_1_class_matches,
sum(DISTINCT (
wtagrels.id_tag = @tag2
)) AS key_2_class_matches,
sum(DISTINCT (
ttagrels.id_tag = @tag1
)) AS key_1_tutor_matches,
sum(DISTINCT (
ttagrels.id_tag = @tag2
)) AS key_2_tutor_matches,
sum(DISTINCT (
ttagrels.id_tag = wtagrels.id_tag
)) AS key_class_tutor_matches
FROM WebClasses as wc
join all_tag_relations AS wtagrels on wc.id_wc = wtagrels.id_wc
join all_tag_relations as ttagrels on (wc.id_author = ttagrels.id_tutor)
WHERE (
wtagrels.id_tag = @tag1
OR wtagrels.id_tag = @tag2
OR ttagrels.id_tag = @tag1
OR ttagrels.id_tag = @tag2
)
GROUP BY wtagrels.id_wc
LIMIT 0 , 20
對於搜索1或3個術語,刪除/添加此查詢中的變量部分。列出我對key_1_class_matches,key_2_class_matches,key_1_tutor_matches(比如,類鍵),key_2_tutor_matches對各種情況(比如教師鍵)值的觀察。
Search term expected result Observation
first class 1 for class 1, all class keys+all tutor keys =1
Sandeepan Nath class 1 for class 1, one class key+ all tutor keys = 1
Sandeepan Nath 1,3 both tutor keys =1 for these classes
Bob Cratchit 2 both tutor keys = 1
Sandeepan Nath bob none no complete tutor matches for any class
我發現一個規律,對於任何情況下,它應該出現在結果的類(ES)有比賽(所有的類鍵和導師鍵)的數量最多。 例如搜索「第一類」,僅針對類別= 1,關鍵匹配總數= 4(1 + 1 + 1 + 1) 搜索「Sandeepan Nath」,類別1,3,4(Sandeepan Nath所有類別)教師鍵匹配。
但沒有模式尋找「Sandeepan Class」 - 1,4,5類應匹配。 現在,我如何根據該模式將條件放入查詢中,以便只返回那些類。
我是否需要在這裏使用全文搜索,因爲它給出了評分/等級值,表示比賽的強度?任何示例查詢都會有幫助。
請注意 - 我已經找到解決方案,用於顯示任何/所有搜索條件與類名匹配的類。 Mysql - Help me alter this search query to get desired results但是,如果所有搜索條件都在輔導員名稱中,則不起作用。所以,我正在修改查詢和試驗。
我認爲聲明「以方便」,在中間有一個有點遲。對不起,但我不明白你想做什麼。 – MJB 2010-06-13 21:39:27