不寻常的多对多 select 查询有困难
Difficulty with unusual many to many select query
我刚开始学习MySQL。我已经研究了几个小时,不幸的是我找不到解决方案。我怀疑这很容易,我只是不知道该怎么做。我在这里或其他网站上都找不到类似的情况。
这是一些示例数据
computer
+------------------+
idcomputer | name
1 | komp001
2 | komp002
computer_has_software
+---------------------------------------+
computer_idcomputer | software_idsoftware
1 | 1
1 | 2
software
+------------------+
idsoftware | name
1 | notepad
2 | eclipse
3 | firefox
4 | google chrome
如您所见komp001
同时安装了记事本和eclipse。
我想要一个查询,告诉我哪些软件可用,但未安装在 komp001
- 即所有未安装在 komp001
.
上的软件
我希望答案是 firefox 和 google chrome。
software
+------------------------+
idsoftware | name
3 | firefox
4 | google chrome
你可以做到。您可以使用 CROSS JOIN
从软件 table 中获取所有条目,然后对 computer_has_software table WHERE
[=21] 执行 LEFT JOIN
=] IS NULL
获取该计算机不存在的软件。
SELECT s.idsoftware, s.name
FROM computer as c
CROSS JOIN software as s
LEFT JOIN computer_has_software as chs
ON s.idsoftware = chs.software_idsoftware
AND c.idcomputer = chs.computer_idcomputer
WHERE chs.software_idsoftware IS NULL
and c.name = 'komp001';
http://sqlfiddle.com/#!9/2914a/3
SELECT
s.*
FROM
software as s
LEFT JOIN
(SELECT
*
FROM
computer_has_software
WHERE
computer_idcomputer = 1
) as chs
ON
s.idsoftware = chs.software_idsoftware
WHERE
chs.software_idsoftware IS NULL
我刚开始学习MySQL。我已经研究了几个小时,不幸的是我找不到解决方案。我怀疑这很容易,我只是不知道该怎么做。我在这里或其他网站上都找不到类似的情况。
这是一些示例数据
computer
+------------------+
idcomputer | name
1 | komp001
2 | komp002
computer_has_software
+---------------------------------------+
computer_idcomputer | software_idsoftware
1 | 1
1 | 2
software
+------------------+
idsoftware | name
1 | notepad
2 | eclipse
3 | firefox
4 | google chrome
如您所见komp001
同时安装了记事本和eclipse。
我想要一个查询,告诉我哪些软件可用,但未安装在 komp001
- 即所有未安装在 komp001
.
我希望答案是 firefox 和 google chrome。
software
+------------------------+
idsoftware | name
3 | firefox
4 | google chrome
你可以做到。您可以使用 CROSS JOIN
从软件 table 中获取所有条目,然后对 computer_has_software table WHERE
[=21] 执行 LEFT JOIN
=] IS NULL
获取该计算机不存在的软件。
SELECT s.idsoftware, s.name
FROM computer as c
CROSS JOIN software as s
LEFT JOIN computer_has_software as chs
ON s.idsoftware = chs.software_idsoftware
AND c.idcomputer = chs.computer_idcomputer
WHERE chs.software_idsoftware IS NULL
and c.name = 'komp001';
http://sqlfiddle.com/#!9/2914a/3
SELECT
s.*
FROM
software as s
LEFT JOIN
(SELECT
*
FROM
computer_has_software
WHERE
computer_idcomputer = 1
) as chs
ON
s.idsoftware = chs.software_idsoftware
WHERE
chs.software_idsoftware IS NULL