MySQL-如何多次连接同一个表以检索同一字段的不同值

MySQL-如何多次连接同一个表以检索同一字段的不同值,mysql,sql,join,Mysql,Sql,Join,我见过类似的问题,但这有点不同。使用之前提出的问题的建议,我无法获得预期的结果。我道歉,如果这是不清楚的任何方式。请随时询问您是否需要任何澄清 我有一个软件表,显示可以安装的每种类型和版本的软件。有一个机器表,其中列出了所有的机器(对这个来说不太重要…)。还有一个MACHINE_软件表,它只列出一个MACHINE_ID和一个SOFTWARE_ID。因此MACHINE_软件表可能会显示带软件1的MACHINE 1、带软件4的MACHINE 1、带软件5的MACHINE 1、带软件1的MACHINE

我见过类似的问题,但这有点不同。使用之前提出的问题的建议,我无法获得预期的结果。我道歉,如果这是不清楚的任何方式。请随时询问您是否需要任何澄清

我有一个软件表,显示可以安装的每种类型和版本的软件。有一个机器表,其中列出了所有的机器(对这个来说不太重要…)。还有一个MACHINE_软件表,它只列出一个MACHINE_ID和一个SOFTWARE_ID。因此MACHINE_软件表可能会显示带软件1的MACHINE 1、带软件4的MACHINE 1、带软件5的MACHINE 1、带软件1的MACHINE 2,等等

我正在写一个查询,它将显示每台机器的四种特定软件的软件版本

因此,对于每个机器ID,我需要查看SOFTWARE.VERSION字段4次

这就是我所拥有的不能正常工作的东西:

SELECT MS.MACHINE_ID, A.VERSION AS A_VERSION, B.VERSION AS B_VERSION, C.VERSION AS C_VERSION, D.VERSION AS D_VERSION
FROM MACHINE_SOFTWARE MS
LEFT JOIN SOFTWARE A ON MS.SOFTWARE_ID = A.ID AND A.DISPLAY_NAME LIKE 'SoftA%'
LEFT JOIN SOFTWARE B ON MS.SOFTWARE_ID = B.ID AND B.DISPLAY_NAME LIKE 'SoftB%'
LEFT JOIN SOFTWARE C ON MS.SOFTWARE_ID = C.ID AND C.DISPLAY_NAME LIKE 'SoftC%'
LEFT JOIN SOFTWARE D ON MS.SOFTWARE_ID = D.ID AND D.DISPLAY_NAME LIKE 'SoftD%'

由于匹配在
MACHINE\u软件
的多行上,因此一个简单的
分组依据
和适当的聚合似乎是有序的

选择MS.MACHINE\u ID,
MAX(A.VERSION)作为A_版本,MAX(B.VERSION)作为B_版本,
最大(C.VERSION)为C_版本,最大(D.VERSION)为D_版本
从机器软件MS
左键连接MS.SOFTWARE_ID=A.ID和A.DISPLAY_NAME上的软件A,如“SoftA%”
在MS.SOFTWARE_ID=B.ID和B.DISPLAY_NAME上左键连接软件B,如“SoftB%”
在MS.SOFTWARE_ID=C.ID和C.DISPLAY_NAME上左键连接软件C,如“SoftC%”
在MS.SOFTWARE_ID=D.ID和D.DISPLAY_NAME上左键连接软件D,如“SoftD%”
按MS.MACHINE\u ID分组

.

为了解决您的问题,我按照以下方式进行

首先我把这3张桌子分成4张桌子,除了机器桌子,我又拿了3张桌子

1软件:软件id[pk],软件名称

2软件版本:版本id[pk],软件id[与软件存在fk关系]

3机器软件:版本id,机器id。[版本号+机器号是此表的主键]和[版本号与软件版本有fk关系,机器号与机器表有fk关系]

现在,我运行下面的查询,列出任何机器中任何软件的所有可用版本

SELECT ms.`version_id` , sv.`Software_id` , s.`software_name` , ms.`MACHINE_ID` , 
FROM  `machine_software` ms
INNER JOIN  `software_version` sv ON ms.version_id = sv.version_id
AND sv.Software_id = ( 
SELECT  `Software_id` 
FROM software_version
WHERE  `version_id` = ms.`version_id` ) 
INNER JOIN  `software` s ON sv.`Software_id` = s.`Software_id` 
AND s.`software_name` = ( 
SELECT  `software_name` 
FROM  `software` 
WHERE  `Software_id` = sv.Software_id ) 
ORDER BY  `version_id` ASC 

如果需要,您也可以在软件版本表中添加版本名称字段,然后在查询中显示版本名称,您必须相应地添加该字段。

请详细说明“无法正常工作”。一些示例数据和所需输出通常比数据的文本描述得到更好的响应。此外,注意不要混淆数据检索和数据显示的问题。后者通常最好在表示层/应用程序级代码(例如一点PHP)中处理,当前查询返回机器#15次。。。一次所有4个软件版本均为空,另一次a_版本中的值正确(B_版本、C_版本、D_版本均为空),第三次结果只有B_版本不为空,另一次结果只有C_版本,最后一次结果只有D_版本。理想情况下,查询将在同一行中显示一个机器ID,后跟所有四个软件版本。同一台机器的ID不应出现多次。此操作有效!!非常感谢你。我在前面尝试了GROUP BY,但是完全忽略了使用MAX,这样值就不会为null。