【问题标题】:MySQL: Combing multiple tables in a searchMySQL:在搜索中组合多个表
【发布时间】:2013-02-25 16:10:25
【问题描述】:

我有一些 SQL 可以搜索网站的内容表并根据相关性返回结果:

SELECT *, 
( (1.3 * (MATCH(strTitle) AGAINST ('+query+string' IN BOOLEAN MODE))) + (0.6 * (MATCH(txtContent) AGAINST ('+query+string' IN BOOLEAN MODE)))) AS relevance 
FROM content 
WHERE (MATCH(strTitle,txtContent) AGAINST ('+query+string' IN BOOLEAN MODE) ) 
ORDER BY relevance DESC 

我需要扩展它以包含另外 2 个表。

我需要搜索一个表 trade_members 的 2 个字段:

公司名称 |联系人姓名

还有一个表格news的2个字段:

news_title |新闻内容

然后一举将结果按相关性排序。如何将这些表格合并到我的结果中?

【问题讨论】:

  • 您的意思是使用JOIN 表搜索吗?
  • 不是真的,按照我的看法,我需要将 3 个表中的每一个中的 2 个可搜索列组合成一个虚拟表,然后对其执行上述查询,所以我只得到一个显示一切的结果集
  • 听起来你可以使用 UNION (假设我明白你想要什么)。 UNION 可以将来自多个 SELECT 语句的结果组合成一个结果集。

标签: mysql


【解决方案1】:

解决方案是三个选择的 UNION。但让我们先剖析一下。

到现在为止

SELECT *, {formula} AS relevance FROM content WHERE {cond} ORDER BY relevance DESC

您现在需要另外两个选择:

SELECT *, {formula} AS relevance FROM trade_members WHERE {cond} ORDER BY relevance DESC
SELECT *, {formula} AS relevance FROM news WHERE {cond} ORDER BY relevance DESC

如果您分别运行这三个语句,您会看到它们返回不同的列。然后,您必须统一这些列。如果没有关于表结构的更多细节,我只能给你一个暗示。

SELECT 'content' as type, contentID as id, strTitle     as title, txtContent   as content, {formula} AS relevance FROM content WHERE {cond} ORDER BY relevance DESC
SELECT 'member'  as type, memberID  as id, company_name as title, contact_name as content, {formula} AS relevance FROM trade_members WHERE {cond} ORDER BY relevance DESC
SELECT 'news'    as type, newsID    as id, news_title   as title, news_content as content, {formula} AS relevance FROM news WHERE {cond} ORDER BY relevance DESC

现在所有三个选择都应该给你一个相似的结果 - 更重要的是:你应该看到所有三个相同的列名,并且每一行应该允许你识别它代表数据库中的哪些数据,例如: 这是内容 17,即公司 33,即新闻 1776。

现在您可以对所有三个进行联合:

(1st select) UNION (2nd select) UNION (3rd select) ORDER BY relevance DESC

但请注意,这可能会很慢,因为您实际上是在创建 四个 需要对文件进行排序的临时表...您可以尝试如何摆脱排序这三个基本选择会影响性能 - 因为它们实际上并不是必需的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-17
    • 2016-12-02
    • 2013-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多