0

16 個のテーブルを持つデータベースがありますが、これに関連するのは 4 つだけです。データベースは、さまざまなサーバー、サーバー情報 (CPU、RAM、IP アドレスなど)、および実行中のソフトウェアを追跡します。ソフトウェアとマシンは、結合テーブルを介して関連付けられています。

CREATE TABLE machsoftjt (
     mid int(4) NOT NULL,
     sid int(4) NOT NULL,
     slid int(4) NOT NULL,
     notes varchar(255) default NULL,
     UNIQUE KEY mid (mid,slid)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

mid はマシン テーブルからのマシンの ID、sid はソフトウェアの名前とソフトウェアのバージョンを含むソフトウェア テーブルからのソフトウェアの ID、slid はソフトリスト テーブルからのソフトウェアリスト ID (実行されているソフトウェアのみをリストし、使用されるテーブル)ソフトウェアのアップグレードが実行されたときに、同じソフトウェアの 2 つの異なるバージョンを実行している 1 台のマシンのエントリがないようにするための一意の制約)。したがって、Microsoft Word 2010 (sid が 1、スライドが 1) と Adob​​e Photoshop 5 (sid が 2、スライドが 2) を実行している machine1 (mid が 1) がある場合、テーブルは次のようになります。

mid  sid   slid
1    1     1
1    2     2

このテーブルから、Microsoft Word と Adob​​e Photoshop の両方を実行しているすべてのマシンを選択したいと考えています。

SELECT machines.machinename FROM (machines INNER JOIN machsoftjt ON 
  machines.mid=machsoftjt.mid) INNER JOIN software ON machsoftjt.sid=software.sid
  WHERE machsoftjt.slid='1' AND machsoftjt.slid='2'

このクエリを実行しても、何も返されません このクエリを実行しても、何も返されません。そして今、私は困惑しており、他に何も思いつきません。すべての助けをいただければ幸いです。

4

3 に答える 3

3

これには自己結合が必要です。だいたい:

SELECT machines.machinename 
FROM machines 
INNER JOIN machsoftjt AS m1 ON machines.mid=m1.mid 
INNER JOIN machsoftjt AS m2 ON machines.mid=m2.mid 
WHERE m1.slid='1' AND m2.slid='2'

ソフトウェア名を取得するには、大まかに次のようにします。

SELECT machines.machinename, s1.*, s2.*
FROM machines 
INNER JOIN machsoftjt AS m1 ON machines.mid=m1.mid 
INNER JOIN machsoftjt AS m2 ON machines.mid=m2.mid 
INNER JOIN software s1 ON m1.sid=s1.sid
INNER JOIN software s2 ON m2.sid=s2.sid
WHERE m1.slid='1' AND m2.slid='2'

おそらく、s1 と s2 から関連する列にエイリアスを設定する必要があります

于 2012-06-19T17:45:12.020 に答える
2

この行が原因で失敗しています:

WHERE machsoftjt.slid = '1' AND machsoftjt.slid = '2'

machsoftjtを1と2の両方に等しくすることはできません。したがって、結果は得られません。

パッケージごとに個別にクエリを実行する必要があります。

私はこのような何かがそれをするべきだと思います:

SELECT machines.machinename 
FROM machines 
WHERE mid IN (SELECT mid FROM machsoftht WHERE sid=1) AND 
 mid IN (SELECT mid FROM machsoftht WHERE sid=2)
于 2012-06-19T17:42:03.573 に答える
2

自己結合やサブクエリは必要ありません。

machsoftjt一度結合するだけで、すべての条件を満たすマシンを取得するには、ソフトウェアがPhotoshopまたはWordのいずれかである2つの行が結合されたマシンのみを取得HAVINGするために句を組み合わせて使用​​できます。GROUP BY

SELECT
    a.machinename
FROM
    machines a
INNER JOIN
    machsoftjt b ON a.mid = b.mid
    AND b.slid IN (1,2)
GROUP BY
    a.mid
HAVING
    COUNT(*) = 2

また、slidはタイプであるため、との前後にINT引用符は必要ありません。12

このアプローチは、条件の追加/削除が簡単であるという点でも柔軟性があります。slid(1,2,4,8)のすべてを持つマシンが必要な場合は、句を調整し、IN句のを上に調整します(マシンが満たす必要のある値がリストに4つあるため)。COUNT(*)HAVING4

于 2012-06-19T18:10:26.753 に答える