首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL‘为一行选择像x或y这样的多个结果

问MySQL‘为一行选择像x或y这样的多个结果
EN

Stack Overflow用户
提问于 2013-11-26 20:12:54
回答 3查看 3.7K关注 0票数 1

好吧,我试着把标题写得尽可能好。下面是我要找的.假设我在一个名为'col1‘的表中有一个ID为3的行,它的值为“苹果、土豆、胡萝卜、南瓜”,我想搜索它。

我想做一个这样的搜索:

代码语言:javascript
复制
SELECT * FROM table WHERE col1 LIKE '%potato%' OR col1 LIKE '%apple%';

...and,我希望它为ID为3的行生成两个独立的结果。

显然,我可以用PHP解析出结果,但是直接从MySQL获得结果似乎要高效得多。有办法这样做吗?

(请注意,这不是家庭作业或其他什么的,我只是为了这个例子尽量通用)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-11-26 21:11:37

您正在用LIKE '%substring%'查询取消索引的使用。在多个查询中使用UNION ALL是可行的,而且很简单。但是,该方法的一个缺点是,MySQL必须扫描数据库中每个子查询的所有行。

因此,对于如下查询,假设有1000条记录:

代码语言:javascript
复制
SELECT * FROM table WHERE col1 LIKE '%potato%' 
UNION ALL
SELECT * FROM table WHERE col1 LIKE '%apple%'

MySQL必须扫描2000年的记录(1000 * 2)。然后,你必须处理结果,当你真的,你只是想要一个计数。对于三种搜索类型,它是3000,等等,它不是很好的规模。

相反,为了性能和简单性(在处理结果时),您可以让MySQL同时使用CASE和SUM语句完成这项工作:

代码语言:javascript
复制
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只扫描一次所有记录并返回您的实际计数。

票数 3
EN

Stack Overflow用户

发布于 2013-11-26 20:15:25

如果您真的需要它来返回2个结果,那么您可以这样做:

代码语言:javascript
复制
SELECT * FROM table WHERE col1 LIKE '%potato%' 
UNION ALL
SELECT * FROM table WHERE col1 LIKE '%apple%'
票数 3
EN

Stack Overflow用户

发布于 2013-11-26 20:30:17

这里有一种以“一般”方式表示查询的方法,这样可以更容易地添加新的比较:

代码语言:javascript
复制
SELECT t.*
FROM table t join
     (select '%potato%' as str union all
      select '%apple%'
     ) comp
     on t.col1 like comp.str;

尽管如此,我建议采用以下备选案文:

代码语言:javascript
复制
SELECT t.*
FROM table t join
     (select 'potato' as item union all
      select 'apple'
     ) comp
     on find_in_set(comp.item, t.col1) > 0
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20227016

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档