【问题标题】:MYSQL Subrequest too longMYSQL 子请求太长
【发布时间】:2016-10-15 08:35:01
【问题描述】:

我有一个非常简单的子查询,但我认为我遗漏了一些东西,因为 MySQL 永远运行它。 假设我有两张桌子,一张FruitGenre 和一张FruitFlavor

 FRUIT GENRE
 | id |  name  |
 |  1 |  apple |
 |  2 | orange |

 FRUIT FLAVOR
 | fruit_id | flavor |
 |    1     | cherry |
 |    2     | orange |

是的,你可以吃樱桃味的苹果。但任何口味都只与一种水果相关(例如,不可能有樱桃味的樱桃)。

我的要求如下:

SELECT * FROM FruitGenre WHERE id IN (SELECT fruit_id FROM FruitFlavor where FruitFlavor.flavor='cherry')

但是,我可以等待一个小时,但仍然没有反应。但如果我将请求一分为二,我会立即得到响应。

拆分:

SELECT fruit_id FROM FruitFlavor where FruitFlavor.flavor='cherry';

SELECT * FROM FruitGenre WHERE id IN (id_written_on_paper_from_previous_request)

任何帮助将不胜感激。

【问题讨论】:

  • 但是如果我将请求一分为二你能添加那个代码吗?
  • 您尝试过使用EXISTSJOIN 吗?
  • 两张表有多少行?
  • 我没有尝试JOIN,第一个(FruitGenre)有7000 els,FruitFlavor有210 000。
  • @Prdp 是的,完成 :)

标签: mysql sql database subquery


【解决方案1】:

你可以试试:

SELECT FG.* FROM FruitGenre FG
left join FruitFlavor FF
on FF.id = FG.id
where FF.flavor='cherry'

如果你在 FF.flavo 中添加索引。查询会更快

【讨论】:

  • @Prdp,你说得对,他可以通过内连接改变左连接,只得到两个表中都存在的行
  • 您使用的Where 子句如何将查询转换为INNER JOIN
【解决方案2】:

EXISTS试试这个方法

SELECT * FROM FruitGenre FG 
WHERE Exists (SELECT fruit_id 
              FROM FruitFlavor FF 
              where FG.id = FF.fruit_id 
                AND FF.FruitFlavor.flavor='cherry')

使用INNER JOIN的另一种方式

SELECT FG.id, 
       FG.NAME 
FROM   fruitgenre FG 
       INNER JOIN fruitflavor FF 
               ON FF.id = FG.id 
WHERE  FF.flavor = 'cherry' 

注意:

  • 如果您在FRUITGENRE 表的ID 列上没有任何索引,那么 在其上创建一个非聚集索引
  • 如果您在fruitflavor 表的Name 列上没有任何索引 然后在其上创建一个非聚集索引(考虑到您的查询和表大小,非常需要索引)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-24
    • 2019-06-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多