2017-04-04 20 views
1

我有如下表:古怪的行爲並具有MySQL時,最大== 0

mysql> select * from foo; 
| id | value | bar | 
+----+-------+------+ 
| 1 |  2 | 3 | 
| 2 |  0 | 3 | 
| 1 |  1 | 5 | 

我想最大value每個id選擇元組。但是,當max(value)爲0時,我沒有得到結果。

mysql> select id,max(value),bar from foo group by id having max(value); 
| id | max(value) | bar | 
+----+------------+------+ 
| 1 |   2 | 3 | 

這應該是這樣的行爲,如果是這樣,爲什麼?

+1

'select id,max(value)from foo group by id'就足以讓每個id獲得最大值。你不需要'having子句'。 –

+2

已將max(value)翻譯爲真或非0.您可能想要從t中獲得max(value)= SELECT max(value) – Mihai

+2

除了'having'的行爲並不像您想象的那樣,讓我獲得最大價值*的記錄。它會檢查所使用的謂詞是否爲真。在你的情況下,謂詞很簡單,在第一種情況下,'max(value)'等於'0'。這在MySQL中被認爲是錯誤的,所以沒有任何返回。 –

回答

1

HAVING不能以任何方式使用從GROUP BY子句中使用的字段所定義的一組記錄中選擇記錄。它更適用於整個組織。

所以,你的情況,你必須做一個自聯接,以獲得表中的字段的其餘部分:

select t1.id, t1.value, t1... 
from foo as t1 
join (
    select id, max(value) as max_value 
    from foo 
    group by id 
) as t2 on t1.id = t2.id and t1.value = t2.max_value 
+0

這不是我想聽到的,但我不得不面對現實。在真正的查詢中,我只需要連接滿足「on」條件的記錄,該條件取決於select中的第一個表。然後我需要獲得最大值並再次進行連接。它變得相當複雜,但我需要忍受。 – martinkunev

+1

@martinkunev在另一個像SQL Server,Oracle或Postgres這樣的RDMBS中,你可能會使用'ROW_NUMBER',它使得事情變得更簡單,但是至今爲止MySQL並沒有實現窗口函數。 –

0

恕我直言,你可以乘以(ID x值)得到MAX夫婦。

create table foo(id int, value int); 
insert into foo values 
(2,0), 
(1,0), 
(2,1), 
(3,0), 
(2,2); 

select id, value 
from foo 
order by (id * value) desc 
limit 1; 

id | value 
2 | 2 

drop table foo;