【问题标题】:Do I need to repeat the WHERE clause in a 'IN (SELECT MAX(id)' subquery?我是否需要在“IN (SELECT MAX(id)”子查询中重复 WHERE 子句?
【发布时间】:2018-10-02 16:34:47
【问题描述】:

我还需要在这个子查询中指定 WHERE 子句吗?

SELECT title, message FROM messages WHERE sender = '.$myid.' AND read != 1 AND id
IN (SELECT MAX(id) FROM messages GROUP BY conversation) ORDER BY id DESC

似乎有/没有重复 WHERE 子句的结果是相同的,但是如果没有很多不同的用户和消息,很难测试。所以我需要更加确定。

是否需要像这样重复 WHERE 子句????,还是 IN 子查询已经被第一个 WHERE 子句缩小了范围? (我假设是后者,但我不确定)。

SELECT title, message FROM messages WHERE sender = '.$myid.' AND read != 1 AND id
IN (SELECT MAX(id) FROM messages WHERE sender = '.$myid.' AND read != 1 GROUP BY conversation) ORDER BY id DESC

两者都是我的代码中的简化示例。我希望我的问题有意义。

【问题讨论】:

  • 当然,子查询中的 where 是必需的,但外部查询中的那些并不是真正需要的,因为您使用子查询请求确切的 id
  • @ahmad 你的意思是我可以/应该这样做? SELECT title, message FROM messages WHERE id IN (SELECT MAX(id) FROM messages WHERE sender = '.$myid.' AND read != 1 GROUP BY conversation) ORDER BY id DESC
  • 是的,外面的那些并没有真正做任何事情,就像你在子查询中做的一样。
  • 好的,我刚刚测试过,我得到了相同的结果(它也可以)。这有点过头了,所以我想我必须相信 WHERE 子句在子查询中就足够了,就像你说的那样。我需要更好地理解它并对其进行更多测试
  • 你应该发布一个答案,如果你有的话,可能会给出一些解释:)

标签: mysql subquery


【解决方案1】:

外部查询中的 where 是多余的,因为在您的内部查询(子查询)中,您使用您想要的约束来请求特定的 id,所以基本上当您有这样的事情时:

SELECT title, message FROM messages WHERE id IN (SELECT MAX(id) FROM messages WHERE
sender = '.$myid.' AND read != 1 GROUP BY conversation) ORDER BY id DESC

这就像您首先收集了 ID,然后请求了类似于以下内容的特定记录:select x from y where id in(1, 2, 3)

对于这个完全相同的查询,它就像运行以下 2 个查询:

Query 1: SELECT MAX(id) FROM messages WHERE sender = '.$myid.' AND read != 1 GROUP BY conversation

Result: 1, 2, 3

第二个查询是:

Query 2: SELECT title, message FROM messages WHERE id IN (1, 2, 3) ORDER BY id DESC

【讨论】:

    【解决方案2】:

    子查询 select 在解析参数方面与第一个完全分开,因此您必须再次输入 where 子句信息

    【讨论】:

      猜你喜欢
      • 2016-03-25
      • 2012-04-18
      • 2012-10-28
      • 2020-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-17
      • 2017-09-27
      相关资源
      最近更新 更多