使用MySQL SELECT查询的结果作为同一查询中的WHERE条件

使用MySQL SELECT查询的结果作为同一查询中的WHERE条件,mysql,Mysql,我正在尝试执行以下查询: SELECT MAX(`peg_num`) AS "indicator" FROM `list` WHERE `list_id` = 1 AND "indicator" >= 1 但我得到的结果是空的。我应该得到99,因为peg_num的范围是00到99 根据指示器检查的值实际上应该是用户输入,所以我希望它是通用的。但是,如果我把等式颠倒过来,它确实给了我正确的结果: SELECT MAX(`peg_num`) AS "indicator" FROM

我正在尝试执行以下查询:

SELECT MAX(`peg_num`)
  AS "indicator"
FROM `list`
WHERE `list_id` = 1
  AND "indicator" >= 1
但我得到的结果是空的。我应该得到99,因为peg_num的范围是00到99

根据指示器检查的值实际上应该是用户输入,所以我希望它是通用的。但是,如果我把等式颠倒过来,它确实给了我正确的结果:

SELECT MAX(`peg_num`)
  AS "indicator"
FROM `list`
WHERE `list_id` = 1
  AND "indicator" <= 1
为什么会这样

编辑:

正如所建议的,我正在使用HAVING子句。。。但我还是暂时放弃了别名:

SELECT MAX(`peg_num`) AS "indicator"
FROM `list`
GROUP BY `list_id`
HAVING MAX(`peg_num`) <= 40
还是很固执。不管having子句中的值是多少,不管不等式是多少,它现在给了我99

编辑2:

作为澄清:


我想做的是查询select peg_num范围内的最大值,但前提是它大于用户给定的输入。所以,在这种情况下,最大值是99。如果用户想要选择像101这样的数字,他/她就不能选择,因为它不在范围内。

在选择之前会发生什么,并且不知道指示器是什么

您应该使用“与分组依据一起使用”来使用“选择”字段

下面是有关语法的文档

像这样的想法

SELECT MAX(peg_num) AS indicator
FROM list
WHERE list_id = 1
HAVING indicator <= 1

我无法测试它,而且我从未见过Mysql,所以我的想法是,

您可能想查看另一个堆栈问题答案上的链接,该问题是关于不允许在where子句中使用别名:

保罗·迪克森引用:

不允许在WHERE子句中引用列别名, 因为当WHERE 第条被执行。见第B.1.5.4节“”

此外:

标准SQL不允许在WHERE子句中引用列别名

交换“=”运算符时在查询中看到的行为是将字符串/varchar“indicator”与数字1进行比较的结果


这就是为什么你会看到正确的答案。当'indicator'>=1,这是真的,当'indicator'时为空,我不知道,但我很惊讶它们中的任何一个都能工作。WHERE在属于单个记录的字段上连续工作,我不希望它在指示器上工作,因为这是一个组计算

这是你想要的吗

SELECT max(`peg_num` ) AS "indicator"
FROM actions
WHERE `peg_num` >=1
AND `list_id` <= 1
你应该使用 无条件引用 这必须起作用:

SELECT MAX(peg_num)
 AS indicator
FROM list
WHERE list_id = 1
  HAVING indicator >= 1
由于双引号,WHERE子句中的指示符被解释为字符串。因此,它的计算结果为0,这意味着它始终小于1。列名必须在反勾号中转义

请记住,WHERE子句是在SELECT之前执行的,因此在SELECT中定义的别名不能用于WHERE子句


我完全重新发明了我的查询,它成功了。问题是,我不得不使用嵌套查询,我不想尽可能多地这样做,我的教授一直不鼓励这样做

无论如何,这是:

SELECT IF(`key` < 900, `key`, null) `key`
FROM (
(

    SELECT MAX(  `peg_num` ) AS  `key` 
    FROM  `list` 
    WHERE  `list_id` =1
    ) AS  `derivedTable`
)

您使用的是哪个mysql版本?我无法复制…服务器版本:5.6.14-MySQL社区服务器GPL。你得到了什么结果?别名不应该用双引号括起来,用勾号代替。尝试了这个但没有成功:嗯,也许您应该使用peg_num>=1而不是idicator>=1指示符是使用聚合函数max形成的别名,对于where子句无效-您可以使用have,正如我前面所说的:where不知道,我知道,但您不能在WHERE子句中使用聚合函数,我确信执行顺序类似于:FROM、WHERE、SELECT、have,因此您不能在SELECT中使用AS,然后在WHERE中使用它。但是你可以从中使用它。如果我们不谈论子查询,这一切都会发生。如果我错了,请让我知道,给一些链接不准确。我想让它做的是得到peg_num的最大值,在本例中为99,但前提是该最大值大于一些用户输入。但是谢谢你提供的信息,我不知道别名在WHERE子句中不能使用,直到现在删除别名中的引号。。。如果我将>=1更改为>=1000,则会给我一个99,或者您可以检查查询两次吗?在条件指示符>=1000的情况下不可能得到99:-您可以在没有嵌套查询的情况下做到这一点:选择case when MAX peg_num<900,然后选择MAX peg_num else null end as key from list WHERE list_id=1
SELECT IF(`key` < 900, `key`, null) `key`
FROM (
(

    SELECT MAX(  `peg_num` ) AS  `key` 
    FROM  `list` 
    WHERE  `list_id` =1
    ) AS  `derivedTable`
)