2012-12-16 38 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