Php 来自MySQL的HTML表,具有最新和唯一的值
不确定要搜索什么,因此这可能是一个重复的问题。我有一个mysql数据库,其中有一个叫做软件的表。软件表由以下字段组成:Php 来自MySQL的HTML表,具有最新和唯一的值,php,mysql,database,codeigniter,Php,Mysql,Database,Codeigniter,不确定要搜索什么,因此这可能是一个重复的问题。我有一个mysql数据库,其中有一个叫做软件的表。软件表由以下字段组成: id (auto_increment) computer_name software_name software_version install_date 每次安装、升级或恢复到以前版本的软件时,表中都会有一个新条目 我正在尝试用php构建一个如下所示的表: .---------------------------------------------------. |
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;
SELECT
b.computer_name,
a.software_name,
MAX(IF(b.software_name = a.software_name AND b.id = a.id, a.software_version, '')) AS software_version
FROM
software AS a,
software AS b
GROUP BY
b.computer_name,
a.software_name
ORDER BY
b.computer_name ASC,
a.software_name ASC,
software_version DESC;
它以我要找的格式生成结果,但是它不是按最新的
安装日期获取版本,而是按找到的最大版本号获取版本。如何修改上述内容以获得最新关联的安装日期的版本?类似的功能应该可以工作(比使用distinct快得多)
这样,您仍然可以显示每台计算机上的所有软件
如果要将输入限制为每台计算机上安装的最新软件,可以使用:
select computer_name,software_name,software_version,install_date from table group by computer_name,software_name order by computer_name,install_date DESC
一项艰苦的工作,但我得到了一个查询,将实现的结果
在数据库端,您需要的是类似于交叉连接的东西,以便能够根据所有不同的软件列出所有不同的计算机,然后过滤所需的软件版本
我是这样做的:
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;
SELECT
b.computer_name,
a.software_name,
MAX(IF(b.software_name = a.software_name AND b.id = a.id, a.software_version, '')) AS software_version
FROM
software AS a,
software AS b
GROUP BY
b.computer_name,
a.software_name
ORDER BY
b.computer_name ASC,
a.software_name ASC,
software_version DESC;
我的表格数据具有以下值:
------ --------------- --------------- ------------------ ---------------------
| id | computer_name | software_name | software_version | install_date |
--------------- ------ --------------- ------------------ ---------------------
| 1 | computer a | software x | ver 1.1 | 2013-03-27 15:58:17 |
| 2 | computer a | software x | ver 1.0 | 2013-03-27 15:58:20 |
| 3 | computer a | software z | ver 1.3 | 2013-03-27 15:58:24 |
| 4 | computer b | software z | ver 1.4 | 2013-03-27 15:58:30 |
| 5 | computer b | software z | ver 1.2 | 2013-03-27 15:58:45 |
| 6 | computer c | software x | ver 1.5 | 2013-03-27 15:58:51 |
| 7 | computer c | software y | ver 1.7 | 2013-03-27 15:58:58 |
--------------- ------ --------------- ------------------ ---------------------
------ --------------- --------------- ------------------ ---------------------
|id |计算机名称|软件名称|软件版本|安装日期||
--------------- ------ --------------- ------------------ ---------------------
|1 |计算机a |软件x版本1.1 | 2013-03-27 15:58:17|
|2 |计算机a |软件x版本1.0 | 2013-03-27 15:58:20|
|3 |计算机a |软件z |版本1.3 | 2013-03-27 15:58:24|
|4 |计算机b |软件z |版本1.4 | 2013-03-27 15:58:30|
|5 |计算机b |软件z |版本1.2 | 2013-03-27 15:58:45|
|6 |计算机c |软件x版本1.5 | 2013-03-27 15:58:51|
|7 |计算机c |软件y版本1.7 | 2013-03-27 15:58:58|
--------------- ------ --------------- ------------------ ---------------------
这是我的输出:
------------ ------------ ------------------
| computer | software | software_version |
------------ ------------ ------------------
| computer a | software x | ver 1.1 |
| computer a | software y | |
| computer a | software z | ver 1.3 |
| computer b | software x | |
| computer b | software y | |
| computer b | software z | ver 1.4 |
| computer c | software x | ver 1.5 |
| computer c | software y | ver 1.7 |
| computer c | software z | |
------------ ------------ ------------------
------------ ------------ ------------------
|计算机|软件|软件|版本|
------------ ------------ ------------------
|计算机a |软件x | 1.1版|
|计算机a |软件y ||
|计算机a |软件z | 1.3版|
|计算机b |软件x ||
|计算机b |软件y ||
|计算机b|软件z|1.4版|
|计算机c |软件x | 1.5版|
|计算机c |软件y | 1.7版|
|计算机c|软件z||
------------ ------------ ------------------
在PHP代码中,您应该这样做(正如我所知,纯PHP-我没有测试下面的PHP代码,这不是编写代码的最佳方式…但我认为它会工作,并且它基于我的查询输出):
此表中是否有任何类型的主键字段(可能是自动递增的)?是的,有一个自动递增的id字段。更新问题…如果安装日期是unix时间戳,则不需要自动递增的主键(即使我身体中的每一根骨头都告诉我应该有一个主键),您可以按安装日期降序订购。但是,设置一个主键和一个简单的选择distinct应该可以工作…的可能副本看起来不错,但是computer b
应该将ver 1.2
作为software z
的安装版本,因为它是在ver 1.4
之后安装的。有什么办法可以纠正吗?@codybuell我以为你想要的是最高版本的软件,而不是上次安装的版本。。。我将尝试修改。。。