異なるIDを持つレコードの束を持つテーブルで最新の行を取得したいとします。
まず、tempテーブルを作成します。このテーブルでは、最新の行(IDでグループ化されています)が見つかります。
CREATE TEMPORARY TABLE
temp1
AS
SELECT DISTINCT ID, max(date) FROM atable GROUP BY ID;
しかし、全体のポイントはこれらのレコードのすべての値を取得することだったので、私は元のテーブルにこれを戻す必要があります、 atable
。迷惑ですが、何ができますか?
私は実際にタプルやオーダーペアを使いたいと思っています。なぜ私はMySQLでこれを行うことができないのですか?
SELECT * FROM atable
WHERE (ID, date) IN
(SELECT ID, date FROM temp1);
これを行う正規の構文は何ですか?
(さらに、哲学的な質問:なぜこれほどMySQLが厄介なのですか?何十年も経ちました。
回答:
回答№1は0なぜ私はMySQLでこれを行うことができないのですか?
あなたはすることができますが、ではありません IN
。複数の列に一致させる方法は EXISTS
:
SELECT * FROM atable
WHERE EXISTS
(SELECT NULL FROM temp1
WHERE temp1.ID = atable.ID AND temp1.date = atable.date);
サブクエリとして元のクエリを使用することもできます。
SELECT * FROM atable
WHERE date = (SELECT max(date) FROM atable WHERE ID = atable.ID)
なぜ、MySQLはこれほどぎこちないのですか?
の "標準的な"使用 IN
ある値が他の値のリストに含まれているレコードを見つけることです(例: WHERE NAME IN ("Smith", "Jones")
。サブクエリが静的リストではなくリストを提供できるように拡張されました。
MySQLが実装するのにふさわしい機能だと思えば(それは非常に簡単だと思えるようです)、あなたは 機能リクエストしかし、1)それを達成するための別の方法があり、2)それが非標準SQLであるため、それは多くの注目を集めれば驚くだろう。