2017-04-04 1 views
1

は、私は次の表がある場合のMySQLに持つ:最大の奇数の挙動と最大== 0

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

を私は各idの最大valueでタプルを選択します。しかし、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

'idでfooグループからのselect id、max(value)'は 'id'ごとに最大値を取得するのに十分です。 'having節'は必要ありません。 –

+2

がmax(value)を持っているかどうかは、真であるか0であるかによって決まります。おそらくmax(value)= select max(value)from t – Mihai

+2

「having」以外に、私に最大の 'value' *を持つレコードを手に入れてください。使用された述語が真であるかどうかをチェックします。あなたの場合、述語は最初の場合に '0'に等しい単純な' max(value) 'です。これはMySQLではfalseとみなされるので、何も返されません。 –

答えて

1

HAVINGは、GROUP BY節で使用されているフィールドで定義されているレコードグループからレコードを選択することはできません。むしろグループ全体に適用されます。

だから、あなたのケースでは、テーブルのフィールドの残りの部分を取得するために自己加入しなければならない:あなたは(IDのx値)を乗じてMAXのカップルを取得することができますIMHO

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

これは私が聞きたかったものではありませんが、現実に対処しなければなりません。実際のクエリでは、selectの最初のテーブルに依存する 'on'条件を満たすレコードだけに参加する必要があります。そして、私はそれを最大限に引き出し、再び参加しなければなりません。それはかなり複雑になりますが、私はそれで生きる必要があります。 – martinkunev

+1

@martinkunev SQL Server、Oracle、Postgresのような別のRDMBSでは、 'ROW_NUMBER'を使った方がはるかに単純ですが、MySQLはウィンドウ関数を実装していません。 –

0

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;