2012-06-19 56 views
0

我有一個數據庫有16個表,但只有四個與此有關。數據庫跟蹤不同的服務器,服務器信息(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 

中旬是從機臺機器的ID,SID是從包含該軟件的名稱和軟件版本的軟件表格軟件的ID,滑從softlist表(只列出一個表softwarelist ID該軟件正在運行並用於唯一的約束,以便在執行軟件升級時,我沒有用於運行同一軟件的兩個不同版本的一臺機器的條目)。因此,如果我有運行Microsoft Word 2010(sid爲1,滑動爲1)和Adobe Photoshop 5(sid爲2,滑動爲2)的machine1(中間爲1),則表格將具有

mid sid slid 
1 1  1 
1 2  2 

我想從此表中選擇運行Microsoft Word和Adobe 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' 

當我運行此查詢,我沒有得到任何backWhen我運行此查詢,我沒有得到任何回報。我現在很難過,不能拿出任何其他東西。所有的幫助將不勝感激。

+0

請提供機器和軟件的表格佈局。 –

回答

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別名相關列

+0

爲什麼要自我加入? –

+0

謝謝你這個作品太棒了!如果我想要同時返回兩個(或者我選擇的多個 - 現在多達6個)軟件名稱和版本,那又如何呢? –

+0

@ ubuntu72 - 查看我的新編輯。應該給你基本的想法。 –

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) 
+0

謝謝你這個作品也很棒!如果我想要同時返回兩個(或者我選擇的多個 - 現在多達6個)軟件名稱和版本,那又如何呢? –

2

沒有必要自聯接或子查詢:

只需加入machsoftjt一次,然後取得機器滿足全部的條件,您可以使用與GROUP BY結合子句只檢索機器在兩行加入其中軟件是Photoshop或字

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 

而且,由於slidINT類型的,你不需要引號大約在12

這種方法也很靈活,因爲它很容易添加/刪除條件。如果你想要的機器全部爲(1,2,4,8)的slid,只需調整IN子句和HAVING子句中的COUNT(*)4(因爲列表中有4個值必須滿足) 。

+0

謝謝你這個作品也很棒!如果我想要同時返回兩個(或者我選擇的多個 - 現在多達6個)軟件名稱和版本,那又如何呢? –

相關問題