2017-02-24 72 views
0

我正在寻找解释为什么下面的代码不起作用。特别是行
lc = MIN(lc)OR lc = MAX(lc)
这不就是比较两个数吗?SQL - 无法使用多个聚合函数结果过滤表

SELECT city, lc FROM 
    (SELECT city, LENGTH(city) AS lc FROM station) AS t1 
GROUP BY city 
HAVING lc=MIN(lc) OR lc=MAX(lc)

编辑,因为人们不读我的问题,而是看我的代码,然后提供其修复,这一点我并不需要删除的部分信息。我想回答关于SQL概念/理论的问题。

+0

它应该会返回一个错误 - 并且几乎可以在MySQL以外的任何数据库中使用。在'HAVING'中使用'lc'是不合适的,因为没有聚合函数。 –

+0

@GordonLinoff,你是什么意思,“因为没有聚合函数”? lc是一个数字,MIN(lc)也返回一个数字,我是不是比较两个数字? –

+1

。 。不,您正在比较来自不确定行的lc值与总体最小值。 –

回答

0

你可以尝试像

SELECT city, LENGTH(city) AS lc FROM station 
WHERE length(city) in (
    SELECT max(length(city)) FROM station 
    union 
    SELECT max(length(city)) FROM station 
) 
1

您可以使用INNER JOIN到表中筛选到找到的最小和最大长度的子查询。

SELECT s.city, LENGTH(s.city) AS city_length 
FROM station AS s 
INNER JOIN (
    SELECT MIN(LENGTH(city)) AS min_length, MAX(LENGTH(city)) AS max_length 
    FROM station 
) AS a ON LENGTH(s.city) IN (a.min_length, a.max_length); 

当然,如果有中最低的联系和最大长度,你会得到所有这些条目。