从表MYSQL获取最相关数据的最佳方法

时间:2011-09-15 05:58:28

标签: mysql query-optimization

我有一个entry表,其中的列如下所示:

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**

我想从5个答案集提供的entry表格中搜索最相关的数据。

我的解决方案#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解决方案:

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 个答案:

答案 0 :(得分:1)

如果你想让英语和日语混合使用,那么这就像是要走的路。请注意,如果你收到很多条目,这个方法会杀了你,做那么多 LIKE 比较会很慢。

您能举例说明有效的answer_set吗?

另一种方法是在保存条目(应用程序端或触发器)时进行相同的比较,除了存储实际答案之外还存储其中有多少是正确的。然后一个简单的

select * from entry where correct_answers = 5

会很快给你想要的行。