我正在尝试执行此查询:
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的数字,则他/她不能,因为它不在范围内。
答案 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)
由于双引号,"indicator"
子句中的WHERE
被解释为字符串。因此,它的计算结果为0,表示它总是小于1.列名必须在反引号中转义。
请记住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)
这必须有效:
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`
)