2013-04-11 15 views
1

我想通過姓名1或NAME2從數據庫中的兩個表進行查詢。MySQL的高效的多表多指標選擇

重要信息:只有一些名字有一個與之相關的二次名2。

的表格N1和N2如下:

table n1 
|---------------*----------------*-----------------| 
| id   | name1   | n2_id   | 
|---------------*----------------*-----------------| 
| 1    | Joseph   | 1    | 
| 2    | David   | NULL   | 
| 3    | James   | 2    | 
|---------------*----------------*-----------------| 

table n2 
|---------------*----------------| 
| id   | name2   | 
|---------------*----------------| 
| 1    | Joe   | 
| 2    | Jim   | 
|---------------*----------------| 

(我知道我可能只是創造了N1表中的名稱2場,但是這僅僅是一個更復雜的系統簡化需要這種結構)

我目前從表N1選擇如下:

SELECT id, name1, MATCH (name1) AGAINST ("+joe*") AS score 
FROM n1 
WHERE MATCH (name1) AGAINST ("+joe*" in boolean mode) 
order by score desc; 

這工作非常有效地與一個非常大的表。

不過,我想從n1和n2選擇,匹配名1或NAME2(當它存在的話)對搜索字符串,就好像兩個表合併。

的問題是,我有一個選擇的效率,通過綜合評分訂單時,有跨多個表不同的索引問題。

這個問題是不是真的只是如何構建SELECT。這是關於如何構建SELECT以使索引得到有效使用的方式。 (表是非常大的)

回答

0

試試這個

SELECT 
n1.id, name1, n2_id, n2.id, name2 
FROM n1 LEFT OUTER JOIN n2 ON 
n2.id = n2_id 
WHERE name1 LIKE '%j%' OR name2 LIKE '%j%' 
ORDER BY name1; 

我用LEFT OUTER JOIN,由於

「只有一些名字有一個與之相關的二次名2。」

我在n2中根據n2_id和id字段組合了兩個表。

我用mysql的LIKE的字符串比較。

這是SQLFIDDLE