2017-04-04 19 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;