2011-09-15 69 views
2

我有一個entry表列如下圖所示:如下圖所示最好的方式來獲得表MYSQL最相關的數據

id | ans_1 | ans_2 | ans_3 | ans_4 | ans_5 | date 

表中的一些樣本數據:

1 | foo | bar | foobar | bar foo | foofoo | 2011/9/15** 
2 | foo2 | bar2 | foobar2 | bar2 foo | foofoo2 | 2011/9/17** 
3 | foo3 | bar3 | foobar3 | bar foo3 | foo3foo | 2011/9/20** 

我希望從上述entry表中搜索最相關的數據,由5個答案集提供。

我的解決方案#1:

SELECT * FROM entry 
WHERE ans_1 LIKE '%$answer_set_1_en%' 
AND ans_2 LIKE '%answer_set_2_en%' 
AND ans_3 LIKE'%answer_set_3_en%' 
AND ans_4 LIKE '%answer_set_4_en%' 
AND ans_5 LIKE '%answer_set_5_en%'; 

不過,我有2套答案(DIFF語言集)現在來比較,這纔是我的解決方案#2:

SELECT * FROM entry 
WHERE (ans_1 LIKE '%$answer_set_1_en%' 
AND ans_2 LIKE '%answer_set_2_en%' 
AND ans_3 LIKE '%answer_set_3_en%' 
AND ans_4 LIKE '%answer_set_4_en%' 
AND ans_5 LIKE '%answer_set_5_en%') 
OR 
(ans_1 LIKE '%$answer_set_1_jp%' 
AND ans_2 LIKE '%answer_set_2_jp%' 
AND ans_3 LIKE '%answer_set_3_jp%' 
AND ans_4 LIKE '%answer_set_4_jp%' 
AND ans_5 LIKE '%answer_set_5_jp%'); 

但是,條目可能與兩種語言混合,所以我的第三個嘗試:

SELECT * FROM entry 
WHERE (
(ans_1 LIKE '%$answer_set_1_en%' OR ans_1 LIKE '%$answer_set_1_jp%') 
AND (ans_2 LIKE '%answer_set_2_en%' OR ans_2 LIKE '%$answer_set_2_jp%') 
AND (ans_3 LIKE '%answer_set_3_en%' OR ans_3 LIKE '%$answer_set_3_jp%') 
AND (ans_4 LIKE '%answer_set_4_en%' OR ans_4 LIKE '%$answer_set_4_jp%') 
AND (ans_5 LIKE '%answer_set_5_en%' OR ans_5 LIKE '%$answer_set_5_jp%'));  

是第三查詢優化/效率已經足夠?我是否可以知道查詢最相關列的其他方法嗎?

回答

1

如果你想允許英語和JAPANES answeres的混合,然後這看起來像的路要走。請注意,如果你得到很多條目,這個問題會殺了你,做很多LIKE比較會很慢。

你能給出一個有效的answer_set的例子嗎?

另一種方法是做同樣的事,在比較節省的條目的時間(申請方或與觸發器),除了存儲實際的答案還存儲有多少人是正確的。然後,一個簡單的

select * from entry where correct_answers = 5 

是想給你想要的行非常快。

+0

感謝安德烈亞斯的快速反應,但我認爲這是我能得到的最好的。 – alenn

相關問題