【发布时间】:2013-03-27 19:45:02
【问题描述】:
不确定要搜索什么,因此这可能是一个重复的问题。我有一个 mysql 数据库,其中有一个名为 software 的表。软件表由以下字段组成:
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 表有关吗?实现这一目标的最佳方法是什么?我正在将 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的版本?
【问题讨论】:
-
此表中是否有任何类型的主键字段(可能是自动增量)?
-
是的,有一个 id 字段可以自动递增。更新问题...
-
如果安装日期是一个 unix 时间戳,你就不需要一个自动递增的主键(即使我身体里的每一根骨头都告诉我你应该有一个),你可以按 install_date 降序排序。但是,设置一个主键和一个简单的选择不同应该可以工作......
标签: php mysql database codeigniter