0

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
4

2 に答える 2

1

あなたはこれを行うことができます。a を使用しCROSS JOINてソフトウェア テーブルからすべてのエントリを取得し、次にLEFT JOINcomputer_has_software テーブルWHEREsoftware_idsoftwareに対して a を実行して、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

于 2015-03-17T20:53:29.320 に答える
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
于 2015-03-17T20:53:46.917 に答える