我该如何进行此查询/咨询?

时间:2015-01-07 12:52:53

标签: php mysql sql

我正在尝试生成一个返回像这样的表的查询(每个版本只出现一次,例如Windows 7)

enter image description here

但是,我只能生成这个(同一版本多次出现,例如Windows 7 Enterprise,Windows 7 Home,...)

enter image description here

这是我的代码

SELECT osname as 'Sistema Operativo' , count(osname) as 'Total UC',
COUNT(CASE WHEN TAG = 'VREG-DI' THEN 1 ELSE NULL END) as 'VRA-BIB' 
from hardware h, accountinfo 
where h.ID = accountinfo.HARDWARE_ID
group by osname

我想在“Windows 7”的名称下添加所有“Windows 7 Enterprise / Starter / ...”。

这会生成de table'Hardware'

CREATE TABLE IF NOT EXISTS `hardware` (
`ID` int(11) NOT NULL,
`DEVICEID` varchar(255) NOT NULL,
`NAME` varchar(255) DEFAULT NULL,
`WORKGROUP` varchar(255) DEFAULT NULL,
`USERDOMAIN` varchar(255) DEFAULT NULL,
`OSNAME` varchar(255) DEFAULT NULL,
`OSVERSION` varchar(255) DEFAULT NULL,
`OSCOMMENTS` varchar(255) DEFAULT NULL,
`PROCESSORT` varchar(255) DEFAULT NULL,
`PROCESSORS` int(11) DEFAULT '0',
`PROCESSORN` smallint(6) DEFAULT NULL,
`MEMORY` int(11) DEFAULT NULL,
`SWAP` int(11) DEFAULT NULL,
`IPADDR` varchar(255) DEFAULT NULL,
`DNS` varchar(255) DEFAULT NULL,
`DEFAULTGATEWAY` varchar(255) DEFAULT NULL,
`ETIME` datetime DEFAULT NULL,
`LASTDATE` datetime DEFAULT NULL,
`LASTCOME` datetime DEFAULT NULL,
`QUALITY` decimal(7,4) DEFAULT NULL,
`FIDELITY` bigint(20) DEFAULT '1',
`USERID` varchar(255) DEFAULT NULL,
`TYPE` int(11) DEFAULT NULL,
`DESCRIPTION` varchar(255) DEFAULT NULL,
`WINCOMPANY` varchar(255) DEFAULT NULL,
`WINOWNER` varchar(255) DEFAULT NULL,
`WINPRODID` varchar(255) DEFAULT NULL,
`WINPRODKEY` varchar(255) DEFAULT NULL,
`USERAGENT` varchar(50) DEFAULT NULL,
`CHECKSUM` bigint(20) unsigned DEFAULT '262143',
`SSTATE` int(11) DEFAULT '0',
`IPSRC` varchar(255) DEFAULT NULL,
`UUID` varchar(255) DEFAULT NULL,
`ARCH` varchar(10) DEFAULT NULL
 ) ENGINE=InnoDB AUTO_INCREMENT=24661 DEFAULT CHARSET=latin1;

这个表'accountinfo'

CREATE TABLE IF NOT EXISTS `accountinfo` (
`HARDWARE_ID` int(11) NOT NULL,
`TAG` varchar(255) DEFAULT 'NA',
`fields_3` varchar(255) DEFAULT NULL
 ) ENGINE=InnoDB DEFAULT CHARSET=latin1;

3 个答案:

答案 0 :(得分:1)

您有两种选择:

1)在SQL上编写一个公式,只检索相关操作系统的一部分,在查询中创建一个新字段并按其分组。

2)创建一个包含两列的新表:OS实名和OS组名,如下所示:

RealOSName                         OSGroupName
--------------------------------   -----------------------
Microsoft Windows 7 Professional   Windows 7     
Microsoft Windows 7 Home Basic     Windows 7
Microsoft Windows 7 Home Premium   Windows 7

按OSGrupName(最佳选择)对您的查询进行分组

答案 1 :(得分:1)

我喜欢ericpap的第二个建议,但如果可能的话,我会通过在你的硬件表“osGroup”或类似的中添加一个额外的列来稍微改变它的方向。

osGroup table
-----
groupId int primary key identity
groupName varchar(100)

因此可以使用以下数据填充:

groupId    groupName
-----
1          Windows 7
2          Windows 8
3          Linux
4          Mac

然后你的硬件表看起来像(几列被剪切

osName                                osGroup
-------
Mac OS X                              4
Miscrosoft Windows 7 Professional     1

这会回答你的具体问题(或者至少接近它 - 我不熟悉不推荐使用的逗号连接语法):

SELECT groupName as 'Sistema Operativo' , count(groupName) as 'Total UC',
COUNT(CASE WHEN TAG = 'VREG-DI' THEN 1 ELSE NULL END) as 'VRA-BIB' 
from hardware h, accountinfo
inner join osGroup o on h.groupId = o.groupId 
where h.ID = accountinfo.HARDWARE_ID
group by groupName

使用这种方法,您将面临使用适当的组填充数据的挑战,尽管它更加规范化。

答案 2 :(得分:0)

osnamez = CASE WHEN PATINDEX('Windows' + '7',osname) > 0 THEN 'Windows 7'
 ELSE osname

自解释。

检查结果的内容是否包含Windows 7的名称然后它将回显Windows 7

另一个解决方案:

PHP:

if(preg_match('/^[windows 7]*$/', $row['osname?'])) 
$row['osname?']= "Windows 7";

^不确定这是否是那个 但只需检查

preg_match

有一个适合它。