web-dev-qa-db-ja.com

where句mysqlのMAX関数

Mysqlクエリのwhere句でmax()関数を使用するにはどうすればよいですか?

 select firstName,Lastname,MAX(id) as max where id=max;

これは私にエラーを与えています:

Unknown column 'max' in 'where clause'

ヘルプはありますか?前もって感謝します。

32
user3176971

同じクエリのWHERE句で集計関数(例:MAX())の結果を参照することはできません。

このタイプの問題を解決するための規範的なパターンは、次のようなインラインビューを使用することです。

SELECT t.firstName
     , t.Lastname
     , t.id
  FROM mytable t
  JOIN ( SELECT MAX(mx.id) AS max_id
           FROM mytable mx
       ) m
    ON m.max_id = t.id

これは、指定された結果を取得するための1つの方法にすぎません。同じ結果を得るためのアプローチは他にもいくつかあり、それらのいくつかは他のものよりもはるかに効率が悪い場合があります。他の答えはこのアプローチを示しています:

 WHERE t.id = (SELECT MAX(id) FROM ... )

場合によっては、最も単純なアプローチは、LIMITを指定したORDER BYを使用することです。 (この構文はMySQLに固有であることに注意してください)

SELECT t.firstName
     , t.Lastname
     , t.id
  FROM mytable t
 ORDER BY t.id DESC
 LIMIT 1

これは1行のみを返すことに注意してください。そのため、同じid値を持つ行が複数ある場合、それらはすべて返されません。 (最初のクエリは、同じid値を持つすべての行を返します。)

このアプローチは、複数の行を取得するように拡張できます。LIMIT 5に変更することで、最大のid値を持つ5つの行を取得できます。

このアプローチのパフォーマンスは、使用可能な適切なインデックスに特に依存していることに注意してください(つまり、idを主キーとして、または別のインデックスの先頭列として使用します。) 。

45
spencer7593

副選択を使用します。

SELECT row  FROM table  WHERE id=(
    SELECT max(id) FROM table
)

注:IDは一意である必要があります。そうでない場合、複数の行が返されます

13
Fabian Bigler
SELECT firstName, Lastname, MAX(id) as max WHERE YOUR_CONDITIONS_HERE HAVING id=max(id) 
5

一部のMysqlバージョンでは、サブセレクト内の「制限」が許可されていません。あなた(そして将来は私)に対する私の答えは、グループを使用することです。

select firstName,Lastname,id 
where {whatever}
group by id
having max(id)

これにより、集計フィールドを持たずに、選択領域に必要なものを返すことができます。

4
jasonseminara

最大のIDを持つ行の姓と名が必要ですか?

その場合(およびFROM句が欠落している場合):

SELECT firstname, lastname, id
FROM foo
ORDER BY id DESC
LIMIT 1;
2
AgRizzo

このクエリは、必要なデータを返します。 fooを使用しているテーブル名に置き換えます。

SQLクエリ:

select firstName,Lastname, id 
from foo 
having max(id) = id 
2
michael.moyer

使用した構文が正しくありません。クエリは次のようになります。

SELECT column_name(s) FROM tablename WHERE id = (SELECT MAX(id) FROM tablename)
2
ucsunil