何を検索すればよいかわからないため、これは重複した質問である可能性があります。ソフトウェアと呼ばれる単一のテーブルを持つmysqlデータベースがあります。ソフトウェア テーブルは、次のフィールドで構成されます。
id (auto_increment)
computer_name
software_name
software_version
install_date
ソフトウェアの一部がインストール、アップグレード、または以前のバージョンに戻されるたびに、テーブルに新しいエントリが作成されます。
私は次のようなphpでテーブルを構築しようとしています:
.---------------------------------------------------.
| | software x | software y | software z |
|---------------------------------------------------|
| computer a | ver 1.0 | | ver 1.2 |
|---------------------------------------------------|
| computer b | | ver 2.1 | |
|---------------------------------------------------|
| computer c | ver 1.3 | ver 1.1 | |
'---------------------------------------------------'
次のようなデータから:
computer_name | software_name | software_version | install_date
----------------------------------------------------------------------
computer a | software x | ver 1.1 | [10 days ago]
computer a | software x | ver 1.0 | [2 days ago]
computer a | software z | ver 1.1 | [20 days ago]
computer a | software z | ver 1.2 | [5 days ago]
はinstall_date
、便宜上 [X 日前] を挿入した実際の日付になります。
テーブルには、各コンピューターにインストールされている各ソフトウェアの最新バージョンが表示されます。一意のコンピューター エントリごとに 1 つの行と、一意のソフトウェア エントリごとに 1 つの列のみが表示されます。
単一の MySQL テーブルでこれを行うことは可能ですか? これを達成するための最良の方法は何ですか?PHP と MySQL を codeigniter で使用しています。
アップデート:
重複する可能性のある質問を見て、次のクエリを準備できました。
SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'MAX(IF(software_name = ''',
software_name,
''', software_version, NULL)) AS ',
replace(software_name, ' ', '_')
)
) INTO @sql
FROM
software;
SET @sql = CONCAT('SELECT computer_name, ', @sql, ' FROM software GROUP BY computer_name');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
私が探している形式で結果を生成しますが、最新install_date
ではなく、見つかった最大のバージョン番号でバージョンを取得しています。上記を変更して、最新の関連付けられたバージョンを取得するにはどうすればよいinstall_date
ですか?