我看到过类似的问题,但这有点不同。使用之前提出的问题的建议,我无法获得理想的结果。如果不清楚,我道歉。如果您需要任何澄清,请随时询问......
我有一个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%'
答案 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
答案 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表中添加版本名称字段,然后在查询中显示您必须相应添加该字段的版本名称。