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

时间:2013-07-22 17:16:51

标签: mysql sql join

我看到过类似的问题,但这有点不同。使用之前提出的问题的建议,我无法获得理想的结果。如果不清楚,我道歉。如果您需要任何澄清,请随时询问......

我有一个SOFTWARE表,显示可以安装的每种类型和版本的软件。有一个MACHINE表,其中包含所有机器的列表(对此不太重要......)。还有一个MACHINE_SOFTWARE表,它只列出MACHINE_ID和SOFTWARE_ID。因此,MACHINE_SOFTWARE表可以显示机器1的软件1,机器1的软件4,机器1的软件5,机器2的软件1,机器2的软件2,等等...

我正在编写一个查询,为每台计算机显示四种特定软件的软件版本。

因此,对于每个MACHINE_ID,我需要4次看到SOFTWARE.VERSION字段。

这就是我无法正常工作的原因:

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%'

2 个答案:

答案 0 :(得分:2)

由于匹配位于MACHINE_SOFTWARE中的多行,因此按顺序显示具有适当聚合的简单GROUP BY;

SELECT MS.MACHINE_ID, 
       MAX(A.VERSION) AS A_VERSION, MAX(B.VERSION) AS B_VERSION,
       MAX(C.VERSION) AS C_VERSION, MAX(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%'
GROUP BY MS.MACHINE_ID

An SQLfiddle to test with

答案 1 :(得分:0)

解决您的查询我已按以下方式进行

首先我将这3张桌子划分为4张桌子,除了机器桌子,我还拿了另外3张桌子

1 软件:Software_id [pk],software_name

2 software_version :version_id [pk],Software_id [与软件有fk关系]

3 machine_software :version_id,MACHINE_ID。 [version_id + MACHINE_ID是此表的pk]和[version_id与software_version有fk关系,而MACHINE_ID与MACHINE表有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 

我希望您也可以在software_version表中添加版本名称字段,然后在查询中显示您必须相应添加该字段的版本名称。