好吧,我试着把标题写得尽可能好。下面是我要找的.假设我在一个名为'col1‘的表中有一个ID为3的行,它的值为“苹果、土豆、胡萝卜、南瓜”,我想搜索它。
我想做一个这样的搜索:
SELECT * FROM table WHERE col1 LIKE '%potato%' OR col1 LIKE '%apple%';...and,我希望它为ID为3的行生成两个独立的结果。
显然,我可以用PHP解析出结果,但是直接从MySQL获得结果似乎要高效得多。有办法这样做吗?
(请注意,这不是家庭作业或其他什么的,我只是为了这个例子尽量通用)
发布于 2013-11-26 21:11:37
您正在用LIKE '%substring%'查询取消索引的使用。在多个查询中使用UNION ALL是可行的,而且很简单。但是,该方法的一个缺点是,MySQL必须扫描数据库中每个子查询的所有行。
因此,对于如下查询,假设有1000条记录:
SELECT * FROM table WHERE col1 LIKE '%potato%'
UNION ALL
SELECT * FROM table WHERE col1 LIKE '%apple%'MySQL必须扫描2000年的记录(1000 * 2)。然后,你必须处理结果,当你真的,你只是想要一个计数。对于三种搜索类型,它是3000,等等,它不是很好的规模。
相反,为了性能和简单性(在处理结果时),您可以让MySQL同时使用CASE和SUM语句完成这项工作:
SELECT SUM(CASE
WHEN t.col1 LIKE '%potato%' THEN 1
ELSE 0
END) AS numPotatoes,
SUM(CASE
WHEN t.col1 LIKE '%apple%' THEN 1
ELSE 0
END) AS numApples
FROM table t这允许MySQL只扫描一次所有记录并返回您的实际计数。
发布于 2013-11-26 20:15:25
如果您真的需要它来返回2个结果,那么您可以这样做:
SELECT * FROM table WHERE col1 LIKE '%potato%'
UNION ALL
SELECT * FROM table WHERE col1 LIKE '%apple%'发布于 2013-11-26 20:30:17
这里有一种以“一般”方式表示查询的方法,这样可以更容易地添加新的比较:
SELECT t.*
FROM table t join
(select '%potato%' as str union all
select '%apple%'
) comp
on t.col1 like comp.str;尽管如此,我建议采用以下备选案文:
SELECT t.*
FROM table t join
(select 'potato' as item union all
select 'apple'
) comp
on find_in_set(comp.item, t.col1) > 0https://stackoverflow.com/questions/20227016
复制相似问题