可交叉引用的MySQL存储阵列

可交叉引用的MySQL存储阵列,mysql,sql,arrays,Mysql,Sql,Arrays,我有一个MySQL数据库,有3个表 计算机(具有以下列): 地点 locationid location campus buildingfloor room 软件 softwareid softwarename softwareversion 目前,我可以很容易地计算出什么计算机在什么位置,因为计算机中的locationid是一个数字,对应于locations表中的locationid 我正在努力

我有一个MySQL数据库,有3个表

计算机(具有以下列):

地点

      locationid
      location
      campus
      buildingfloor
      room
软件

      softwareid
      softwarename
      softwareversion
目前,我可以很容易地计算出什么计算机在什么位置,因为计算机中的locationid是一个数字,对应于locations表中的locationid

我正在努力做的是总结,什么地方有什么软件。我已经能够进行一个查询,可以找到具有相同locationid的所有计算机(因此房间中的所有计算机),但我发现很难计算一个位置具有的相同软件实例,因为computers表中的'softwareid'列存储为一个varchar数组,使用“#”作为除数。例如:

locationid 5具有以下具有软件id的计算机:

计算机名称:TEST1软件ID:#1#4#53#67#32#

计算机名称:TEST2软件ID:#7#1#55#36#92#

计算机名称:TEST3软件ID:#2#67#7#5#2#

我正在努力寻找一种有效的方法来筛选这些数据,计算一个位置有多少软件实例,并质疑我存储阵列的方法是否正确——我正试图实现这一点

我想要的输出是一个表,它在一个位置包含所有不同的软件,以及安装了该软件的计算机数量


任何帮助或提示将不胜感激;我是SQL新手。

哦,天哪,数据库模式真是一团糟!通过将值列表放入字符串中来创建一对多关系的业务使生活变得艰难。您真正需要的是一个单独的
计算机软件
联接表

你在这里有一种拯救的恩典。您在自己的表中有一个所有可能的软件项的列表,并且字符串格式被很好地分隔

因此,您可以发出这个SQL查询()来连接
计算机
软件

SELECT c.name, c.id, s.name AS sname,s.version
  FROM software AS s
  JOIN computers AS c ON c.softwareid LIKE CONCAT('%#',s.id,'#%')
 ORDER BY c.name, s.name, s.version
这将表现得非常糟糕。但是,那又怎么样,它仍然比重新开始设计要快。它使用了大量这样的操作来匹配这两个表

    '#1# #4# #53# #67# #32#' LIKE  '%#53#%'
它使用
CONCAT()

因此,我建议您通过使用此命令创建一个view computers\u软件来向前推进

CREATE VIEW computers_software AS
    SELECT c.id AS computer_id, s.id AS software_id
    FROM software AS s
    JOIN computers AS c ON c.softwareid LIKE CONCAT('%#',s.id,'#%')
此视图--此虚拟表--此虚拟联接表--包含成对的
(计算机id、软件id)
值。行的存在意味着指定的计算机具有指定的软件

然后,要确定哪个软件位于哪个位置,请执行以下操作(未调试):

同样,以sql流畅的方式实现这一点的诀窍是构建称为计算机和软件的多对多关系。我建议你现在就把它作为一种观点


通常,应用程序开发人员会创建这样的表,因为它工作得更好。你可以考虑做这个开关。如果可能的话,为计算机软件创建一个关系表,它有计算机和软件ID作为栏。如果你把计算机ID应用到软件表上是很好的。谢谢Kul深层。KAMBOJ,这正是我所做的,仍然习惯于“SQL”的思维方式:)你,Ollie,非常有帮助!非常感谢。同时也感谢“kuldeep.kamboj”,因为我已经开始制作他建议的桌子了。我已经重新编写了powershell脚本,将数据导入数据库。我现在有一个表,显示“Computerid”和“Softwareid”,每个单元格只包含一个数字,我相信这会使SQL查询更快?我只是想找到一种方法,从一个位置获取所有的computerid,然后将其与我的computerid-softwareid表交叉引用。非常感谢您的解释,奥利,帮助我理解:)
CREATE VIEW computers_software AS
    SELECT c.id AS computer_id, s.id AS software_id
    FROM software AS s
    JOIN computers AS c ON c.softwareid LIKE CONCAT('%#',s.id,'#%')
SELECT L.location, s.name, s.version, COUNT(*) AS copies
  FROM location AS L
  JOIN computers AS c ON l.id = c.locationid
  JOIN computers_software AS cs ON c.id = cs.computer_id
  JOIN software AS s ON cs.software_id = s.id
 GROUP BY  L.location, s.name, s.version