我是否需要在'IN(SELECT MAX(id)')子查询中重复WHERE子句?

时间:2018-10-02 16:34:47

标签: mysql subquery

我还需要在此子查询中指定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

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

2 个答案:

答案 0 :(得分: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)

的特定记录一样

对于相同的确切查询,就像运行以下两个查询:

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

答案 1 :(得分:0)

就解析的参数而言,子查询选择与第一个查询完全分开,因此您将不得不再次输入where子句信息