不知道要搜索什么,所以这可能是一个重复的问题。我有一个名为软件的单一表的MySQL数据库。该软件表包括以下字段:来自MySQL的HTML表格,具有最新和唯一的值
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天前]为了方便起见。
该表将显示每台计算机上安装的每个软件的最新版本,每个唯一计算机条目只有一行,每个唯一软件条目只有一列。
这可能与一个单一的MySQL表?什么是实现这一目标的最佳方式?我使用codeigniter使用PHP和MySQL。
更新:
从看可能重复的问题,我能够准备这个查询:
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
的版本?
本表中是否有任何一种主键字段(也许是自动增量)? – 2013-03-27 19:49:43
是的,有一个自动递增的ID字段。更新问题... – codybuell 2013-03-27 19:52:50
如果安装日期是一个unix时间戳,则不需要自动增量主键(即使我身体中的每个骨头都告诉我应该有一个主键),并且您可以通过install_date降序进行排序。然而,设置一个主键和一个简单的选择不同应该工作... – 2013-03-27 20:02:02