难以与不寻常的多对多选择查询

时间:2015-03-17 20:43:30

标签: mysql join 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同时安装了notepad和eclipse。

我想要一个查询,告诉我哪些软件可用,但未安装在komp001上 - 即所有软件都不在komp001上。

我希望答案是firefox和google chrome。

software
+------------------------+
idsoftware | name
3          | firefox
4          | google chrome

2 个答案:

答案 0 :(得分:1)

你可以这样做。您可以使用CROSS JOIN从软件表中获取所有条目,然后对{computer_has_software表LEFT JOIN software_idsoftware WHERE执行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';

sqlfiddle

答案 1 :(得分:0)

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