2017-02-24 128 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); 

當然,如果有中最低的聯繫和最大長度,你會得到所有這些條目。