mysql
sql
full-text-search
1
我想在多个表上进行全文搜索。每个表都有一个单独的全文索引。我有以下表格:如何在多个表上进行全文搜索
table1:
id | name | description
table2:
id | name | description
table3:
id | name | description
我希望能够在所有表中搜索“name”和“description”字段。我目前有以下查询:
SELECT id, name, description, 'table1' AS source
FROM table1
WHERE MATCH(name, description) AGAINST ('keyword' IN BOOLEAN MODE)
UNION
SELECT id, name, description, 'table2' AS source
FROM table2
WHERE MATCH(name, description) AGAINST ('keyword' IN BOOLEAN MODE)
UNION
SELECT id, name, description, 'table3' AS source
FROM table3
WHERE MATCH(name, description) AGAINST ('keyword' IN BOOLEAN MODE)
ORDER BY id;
问题是,这不会返回任何结果。每个表中都有记录,其中包含我要搜索的关键字。如果我分别运行每个查询,它们都会返回结果。我不确定问题是什么。有什么建议么?
回答
3
问题在于 UNION删除重复的行。如果你想保留所有的行,使用 UNION ALL:
SELECT id, name, description, 'table1' AS source
FROM table1
WHERE MATCH(name, description) AGAINST ('keyword' IN BOOLEAN MODE)
UNION ALL
SELECT id, name, description, 'table2' AS source
FROM table2
WHERE MATCH(name, description) AGAINST ('keyword' IN BOOLEAN MODE)
UNION ALL
SELECT id, name, description, 'table3' AS source
FROM table3
WHERE MATCH(name, description) AGAINST ('keyword' IN BOOLEAN MODE)
ORDER BY id;
这是一个合理的猜测,但在这种情况下,我认为这是不可能的,因为每个查询都有不同的“来源”列,因此不可能有重复的行。 –
@David Aldridge - 好点。这是一个简单的修复,所以我希望如此。 –
我想你需要在每个表的ID前面加上表名。例如,你应该有table1.id,table2.id,table3.id。这将有助于区分不同表中的ID。另外,在ORDER BY子句中,你应该指定你想要排序的ID。
SELECT table1.id, table1.name, table1.description, 'table1' AS source
FROM table1
WHERE MATCH(table1.name, table1.description) AGAINST ('keyword' IN BOOLEAN MODE)
UNION
SELECT table2.id, table2.name, table2.description, 'table2' AS source
FROM table2
WHERE MATCH(table2.name, table2.description) AGAINST ('keyword' IN BOOLEAN MODE)
UNION
SELECT table3.id, table3.name, table3.description, 'table3' AS source
FROM table3
WHERE MATCH(table3.name, table3.description) AGAINST ('keyword' IN BOOLEAN MODE)
ORDER BY table1.id, table2.id, table3.id;
这可能不会解决问题。如果查询单独工作,则在'UNION'中应该没有问题。并且,在MySQL中,'ORDER BY'中的'id'将按第一个子查询中的'id'排序。 –
发布于2025-7-20 13:44 杭州


分享
注册
1分钟入驻>
+微信
秒答
搜索更多类似问题 >
电话咨询
15372872601 

