2017-09-15 14 views
0

のMAX()値を登録しよう:MYSQLは、私は私のデータベースに牽引テーブルを持っているENUM

user_id | user_name 
--------+---------- 
1  |jim 
2  |john 

user_id | status 
--------+---------- 
1  |ONE 
2  |TWO 
1  |THREE 

状況はそのように定義列挙型、である:これはONEであることをgaranteeすべき

status enum('ONE','TWO','THREE') NOT NULL 

最も低い状態、3つは最高です。 Imは次のようにユーザーのステータスを取得する:

SELECT user_id, type, status, event_date, valid_from, valid_to 
FROM status_event 
WHERE user_id = 1 
ORDER BY status DESC 
LIMIT 1; 

これは、ステータスの順序を使用していることにより、順序として期待される、状態THREEのように、私を与えます。

ここでは、すべてのユーザーとその最高ステータス値のリストを取得するためにSQLを作成します。 ImはMAX()関数が文字列としての状態値を明らかに比較していて、最大値としてTWOを返すようになっています。さらに、私はそれらにどのように参加するのか考えていない、これを行うことは可能ですか?サブクエリが必要ですか?

私が望む結果は以下の通りです: - 文字列値ではなく整数値を使用して

残念ながら
user_name| status 
---------+---------- 
jim  |THREE 
john  |TWO 
+0

**のように列挙型の値を作成することができます**整数**ので、順序で正しく動作します。現時点では** string **、TwoとThreeは** T **で始まります。 – user3888958

+0

ORDER BYは正常に動作していますが、MAX()は動作していません –

答えて

0

、MySQLはMAX()/MIN()と列挙型を持つ既知のバグがあります。このバグはORDER BYには当てはまりません。 (これが最近のバージョンで修正されたかどうかはわかりません)。

しかし、あなたが望むものを達成することができます。

SELECT se.* 
FROM status_event se 
WHERE se.status = (SELECT se2.status 
        FROM status_event se2 
        WHERE se2.user_id = se.user_id 
        ORDER BY se2.status DESC 
        LIMIT 1 
       ); 

ユーザーごとに単一の行の場合:あなたは最高の状態で行を望んでいた場合

SELECT DISTINCT se.user_id, se.status 
FROM status_event se 
WHERE se.status = (SELECT se2.status 
        FROM status_event se2 
        WHERE se2.user_id = se.user_id 
        ORDER BY se2.status DESC 
        LIMIT 1 
       ); 
0

おそらく文字列を持つ列挙型の仕事にMAXとORDER BYを知っているようありませんintである。

limit 1を削除し、statusのみを選択してクエリを編集してみてください。 正しい順序が与えられていないことがわかります。 これはenumのステータスDESCによる注文です: 2つ、3つ、1つ。

したがって、order byとmax()は両方ともstringで動作します。

私の提案は、ステータスにVARCHARの代わりにINTを使用することです。

また、どのように参加するのかわかりませんが、これを行うことは可能ですか?サブクエリが必要ですか?

整数の列挙型の最大値を取得し、この取得された値を条件式の外側のクエリに配置できます。

関連する問題