2012-12-16 73 views
2

下令這個問題是關於索引或替代UNION,將工作一樣。替代或解決方案UNION不要有數據手動

在進一步的例子中,我們假設titletextcontent都具有fulltextindex

假設我們有三個報表

SELECT title as text FROM news ORDER BY score DESC 
SELECT name as text FROM pages ORDER BY score DESC 
SELECT content as text FROM comments ORDER BY score DESC 

我們可以將它們組合起來(請注意,我們手動進行訂購)

SELECT title as text FROM news ORDER BY score DESC 
UNION 
SELECT name as text FROM pages ORDER BY score DESC 
UNION 
SELECT content as text FROM comments ORDER BY score DESC 

現在我們已經text,我們可以PRI NT但訂單將是1)消息2)3頁)評論

這是非常糟糕的,因爲我們希望這些按分數排序不同可能

因此,我們可以將所有這些THREE SELECTSONE SELECT和秩序他們

SELECT text FROM (
    SELECT title as text FROM news ORDER BY score DESC 
    UNION 
    SELECT name as text FROM pages ORDER BY score DESC 
    UNION 
    SELECT content as text FROM comments ORDER BY score DESC 
) as combination 

現在我們可以通過score

再次ORDER吧,這是非常糟糕的,因爲分數是根據每個表不是每個整選擇

所以,我們會繼續前進,我的問題更接近。

下一步是引進MATCH() and AGAINST()和我們寫

SELECT text, MATCH(text) AGAINST ('anything') as total_score FROM (
     SELECT title as text FROM news ORDER BY score DESC 
     UNION 
     SELECT name as text FROM pages ORDER BY score DESC 
     UNION 
     SELECT content as text FROM comments ORDER BY score DESC 
    ) as combination ORDER BY total_score DESC 

我們完成了!如果不是MATCH(text)似乎不會被索引爲全文,那麼一切都應該完美。出現

錯誤:無法找到FULLTEXT指數相匹配的列列表

現在consufion來了,有可能是一無所有,但不知何故讓text一個FULLTEXT。不幸的是,作爲text沒有這樣的列現有的數據庫,說你不能找到它在phpMyAdmin,使其FULLTEXT這種方式。

我想延長name as text進一步使其接近name as text type fulltext或類似的東西,我找不到任何地方。

請幫我解決,我想聽聽任何東西,也許有另一種方式來解決這種情況?我不知道。我會非常感謝。

回答

2

使用UNION ALL代替UNION

UNION各種的聯合在一起的結果集丟棄重複(如果有)。

UNION ALL作爲選擇保留順序(並保存副本,如果有的話)

+0

我想是這樣的:http://stackoverflow.com/questions/13904885/fulltext-search-scores-calculated-not-from- all-given-tables如果您有時間,請參閱它,否則感謝您的回覆。 – Davit