Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 来自MySQL的HTML表,具有最新和唯一的值_Php_Mysql_Database_Codeigniter - Fatal编程技术网

Php 来自MySQL的HTML表,具有最新和唯一的值

Php 来自MySQL的HTML表,具有最新和唯一的值,php,mysql,database,codeigniter,Php,Mysql,Database,Codeigniter,不确定要搜索什么,因此这可能是一个重复的问题。我有一个mysql数据库,其中有一个叫做软件的表。软件表由以下字段组成: id (auto_increment) computer_name software_name software_version install_date 每次安装、升级或恢复到以前版本的软件时,表中都会有一个新条目 我正在尝试用php构建一个如下所示的表: .---------------------------------------------------. |

不确定要搜索什么,因此这可能是一个重复的问题。我有一个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天前]输入

该表将显示每台计算机上安装的每种软件的最新版本,每个唯一的计算机条目只有一行,每个唯一的软件条目只有一列

这可以通过一个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我以为你想要的是最高版本的软件,而不是上次安装的版本。。。我将尝试修改。。。