2011-05-30 83 views
1

我公司通过与全​​文检索3页不同的表查找受影响的表,我需要检测的结果是来自哪个表。这是我现在有:检索的全文检索

SELECT id, title AS page_title, MATCH(title) AGAINST(:search_term IN BOOLEAN MODE) AS score FROM pages WHERE MATCH(title) AGAINST(:search_term IN BOOLEAN MODE) UNION 
SELECT id, title AS agenda_title, MATCH(title) AGAINST(:search_term IN BOOLEAN MODE) AS score FROM agenda WHERE MATCH(title) AGAINST(:search_term IN BOOLEAN MODE) UNION 
SELECT id, title AS news_title, MATCH(title) AGAINST(:search_term IN BOOLEAN MODE) AS score FROM news WHERE MATCH(title) AGAINST(:search_term IN BOOLEAN MODE) ORDER BY score ASC 

如果PAGE_TITLE已设置我检测,如果没有,如果议程标题已定等 但结果总是从第一个查询(页)。因此,如果访问者搜索并查找新闻项目,则会在此情况下显示为页面。

所以我的问题是;我究竟做错了什么?这是做这件事的最好方法吗?

在此先感谢!

回答

1

当您使用UNIONs那样,添加一个决定因素列,只是一个常数,对每个表,让你知道每个条目来自哪个表的。

SELECT source, id, title, score 
    FROM 
    (SELECT 'pages' AS source, id, title, MATCH(title) AGAINST(:search_term IN BOOLEAN MODE) AS score 
     FROM pages WHERE MATCH(title) AGAINST(:search_term IN BOOLEAN MODE) 
    UNION 
    SELECT 'agenda' AS source, id, title, MATCH(title) AGAINST(:search_term IN BOOLEAN MODE) AS score 
     FROM agenda WHERE MATCH(title) AGAINST(:search_term IN BOOLEAN MODE) UNION 
    SELECT 'news' AS source, id, title, MATCH(title) AGAINST(:search_term IN BOOLEAN MODE) AS score 
     FROM news WHERE MATCH(title) AGAINST(:search_term IN BOOLEAN MODE) 
) ORDER BY score ASC 

您还需要在SELECT在整个组合集来包装它ORDER BY,你有那只在最后一个表,我认为顺序的方式。改变title属性不是一个好主意,或者,作为列名必须是相同的UNION或将与第一个遇到的标题,或只是空白列名合并。

1

尝试像查询:

SELECT 'pages' AS used_table,id, title, MATCH(title) AGAINST(:search_term IN BOOLEAN MODE) AS score FROM pages WHERE MATCH(title) AGAINST(:search_term IN BOOLEAN MODE) UNION 
SELECT 'agenda' AS used_table,id, title , MATCH(title) AGAINST(:search_term IN BOOLEAN MODE) AS score FROM agenda WHERE MATCH(title) AGAINST(:search_term IN BOOLEAN MODE) UNION 
SELECT 'news' AS used_table,id, title , MATCH(title) AGAINST(:search_term IN BOOLEAN MODE) AS score FROM news WHERE MATCH(title) AGAINST(:search_term IN BOOLEAN MODE) ORDER BY score ASC 

,并检查used_table现场检查使用巫表。