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

时间:2014-07-27 05:56:11

标签: mysql

我正在尝试执行此查询:

SELECT MAX(`peg_num`)
  AS "indicator"
FROM `list`
WHERE `list_id` = 1
  AND "indicator" >= 1

但是我得到了NULL的结果。我应该得到的是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

还很顽固。无论不等式如何,它现在都给了我99,无论有没有条款。

EDIT2:

作为澄清:

我想要发生的是查询选择peg_num范围内的最大值,但前提是它大于用户给定的输入。因此,在这种情况下,最大值为99.如果用户想要选择类似101的数字,则他/她不能,因为它不在范围内。

6 个答案:

答案 0 :(得分:1)

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

Can you use an alias in the WHERE clause in mysql?

Paul Dixon引用:

  

不允许在WHERE子句中引用列别名,   因为WHERE时可能尚未确定列值   子句被执行。见B.1.5.4,“Problems with Column Aliases”。

此外:

  

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

当您更换&#39;&lt; =&#39;时,您在查询中看到的行为和&#39;&gt; =&#39;运算符,查询结果比较字符串/ varchar&#39;指标&#39;数字1。

这就是为什么你看到正确的答案..当(&#39;指示符&#39;&gt; = 1)是真的,而当(&#39;指标&#39;&lt; = 1)这是假的。

答案 1 :(得分:1)

  1. 由于双引号,"indicator"子句中的WHERE被解释为字符串。因此,它的计算结果为0,表示它总是小于1.列名必须在反引号中转义。

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

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

答案 2 :(得分:0)

在SELECT之前发生了什么,并且不知道&#34; s&#34;指示符&#34;。

您应该使用HAVING(使用GROUP BY)来使用SELECT字段

这里是语法

的文档

http://dev.mysql.com/doc/refman/5.5/en/select.html

这样的想法是

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

我无法测试它,我从来没有遇到Mysql所以只是想法,

答案 3 :(得分:0)

我不知道,但我很惊讶他们中的任何一个都在工作。 WHERE在属于单个记录的字段上连续工作,我不希望它在&#34;指示符&#34;因为这是一个小组计算。

这样做你想要的吗?

SELECT max(`peg_num` ) AS "indicator"
FROM actions
WHERE `peg_num` >=1
AND `list_id` <= 1

答案 4 :(得分:0)

  1. 您应该使用HAVING
  2. HAVING条件中没有引号
  3. 这必须有效:

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

答案 5 :(得分:0)

我完全重新发明了我的查询并且它有效。问题是,我不得不使用嵌套查询(我想尽可能不这样做,我的教授总是劝阻它)。

无论如何,这是:

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

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