次のサンプルテーブルを使用して、従来のソフトウェアバージョン番号に基づいて、次の各仮想アプリケーションの最新バージョンを返すMySQLクエリを作成します。私はMySQLバージョン5.5.17を使用しています。MySQLが最新のソフトウェアバージョンを保存してクエリする
より洗練されたクエリを作成できる関数を作成できる場合は、ストアド関数の使用も検討します。
app | major | minor | patch
------+-------+-------+--------
cat | 2 | 15 | 0
cat | 2 | 15 | 1
cat | 2 | 2 | 0
dog | 1 | 0 | 1
dog | 1 | 7 | 2
dog | 3 | 0 | 0
fish | 2 | 2 | 5
fish | 2 | 3 | 1
fish | 2 | 11 | 0
期待クエリ結果:
app | major | minor | patch
------+-------+-------+--------
cat | 2 | 15 | 1
dog | 3 | 0 | 0
fish | 2 | 11 | 0
あなたがテストできるようにするには、MY_TABLEという名前のテーブルを作成するには、このSQLを使用することができます。
CREATE TABLE IF NOT EXISTS `my_table` (
`app` varchar(10) NOT NULL,
`major` int(11) NOT NULL DEFAULT '0',
`minor` int(11) NOT NULL DEFAULT '0',
`patch` int(11) NOT NULL DEFAULT '0'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `my_table` (`app`, `major`, `minor`, `patch`) VALUES
('cat', 2, 15, 1),
('cat', 2, 15, 0),
('cat', 2, 2, 0),
('dog', 1, 0, 1),
('dog', 1, 7, 2),
('dog', 3, 0, 0),
('fish', 2, 2, 5),
('fish', 2, 3, 1),
('fish', 2, 11, 0);
私は考えることができる3つのアプローチがあります。そしてそれらのすべてはかなり醜いです、そして、それらのすべてがサブクエリを含んでいます....1)GROUP BY問合せのSELECTリストで相関サブクエリを使用する2)インライン・ビューを使用して(ゼロ埋め込み)major_minor_patch 0002_0015_0001のカノニカル文字列連結の最大値を取得し、文字列表現を解凍するか、または表に結合して一致する行を取得する、または3)各アプリの行を並べ替えるクエリを使用し、次に各アプリの最高バージョンで、ユーザー定義の値を持つトリック(サポートされていない)を使用して、各アプリの「最初の」行にフラグを立てます。それらのどれもかなりです。 – spencer7593
http://sqlfiddle.com/#!9/bd378/3 – Strawberry
テーブルを変更して別の列を追加するオプションがありますか? – Mjh