我有两张桌子(我只会列出我要搜索的字段)
MySQL版本:5.0.96-community
Table 1: Clients (860 rows)
ID_CLIENT (varcahar 10)
ClientName (text)
Table 2: Details (22380 rows)
ID_CLIENT (varchar 10)
Details (varchar 1000)
Details
表可以有来自同一客户端的多行。
我需要搜索这两个表并检索与搜索值匹配的客户ID。
如果我的搜索值为“蓝色”,则必须匹配CLientName
(来自Blue
berries Corp)或第二个表中的Details
(例如“它有一个blue
徽标)
结果应该是符合条件的客户ID的列表。
如果我对一个表进行查询,则需要一段时间
#0.002 sec
select a.`ID_CLIENT` from clienti a
where
a.`ClientName` LIKE '%blue%'
#0.1 sec
SELECT b.`ID_CLIENT` FROM Details b
WHERE b.`Details` LIKE '%blue%'
GROUP BY b.`GUID_CLIENT`
但如果我尝试加入这两个查询,则需要很长时间。
我的问题
根据两个表格的搜索结果得到ID-s列表的最佳方式是什么?
为了提高详细信息表格中的搜索效果,我知道%..%不是很快,但我也需要部分匹配。
编辑(根据答案)
#~0.2 sec
(SELECT a.`ID_CLIENT` FROM `clienti` a where a.`ClientName` like '%blue%')
union
(SELECT distinct b.`ID_CLIENT` FROM `Details` b where b.`Details` like '%blue%')
它返回搜索值过滤的两个表中的ID列表。
编辑2:最终查询
使用那个id列表,我可以过滤客户端表,只根据他们的id获取两个表中的客户端
select cl.`ID_CLIENT`, `ClientName`, `OtherField`
from clients cl
join
((SELECT a.`ID_CLIENT` FROM `clients` a where a.`ClientName` like '%blue%')
union
(SELECT distinct b.`ID_Client` FROM `Details` b where b.`Detail` like '%blue%' )) rez
on cl.`ID_CLIENT` = rez.`ID_CLIENT`
答案 0 :(得分:1)
如果两个查询都按您的意愿运行,只需将结果合并在一起即可。这比无法有效使用索引的查询上的'或'要快得多,它还允许您在同一语句中删除重复项。
答案 1 :(得分:1)
Divide et impera:创建两个子查询。
在第一个子查询中,左边连接客户端,其详细信息基于client_id,过滤行值,其中客户端名称为'%xxxxx%'
然后是另一个子查询,左边连接客户端的详细信息(但在输出投影中保持相同的字段顺序),过滤详细信息文本字段。然后从两个子查询创建一个联合查询,最后从此联合
创建一个select distinct *最终架构:
从(subquery1 union subquery2)
中选择distinct *这似乎是一个非常缓慢而愚蠢的手动查询计划优化",只是尝试一下,让我们知道它有效!
答案 2 :(得分:1)
如果您的两个查询有效,请使用union
:
select a.`ID_CLIENT`
from clienti a
where a.`ClientName` LIKE '%blue%'
union
SELECT b.`ID_CLIENT`
FROM Details b
WHERE b.`Details` LIKE '%blue%';
union
会删除所有重复项,因此您不需要单独的group by
查询。
为什么这两个表的两个搜索字符串不同?问题建议在两者中搜索blue
。
如果个人查询效果不佳,您可能需要切换到全文索引。