我有一个数据库,其中有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=utf8mid是machines表中的机器id,sid是软件表中包含软件名称和软件版本的软件id,slid是softlist表中的软件列表id (该表只列出正在运行的软件,并用于唯一约束,因此当执行软件升级时,我没有运行同一软件的两个不同版本的一台机器的条目)。因此,如果我有运行Microsoft word2010( sid为1,slid为1)和Adobe Photoshop 5( sid为2,slid为2)的machine1 ( mid为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我运行这个查询,我没有得到任何东西。现在我被难住了,什么也想不出来了。所有的帮助都将不胜感激。
发布于 2012-06-20 01:45:12
这需要一个自连接。大致如下:
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-20 01:42:04
它之所以失败,是因为下面这行:
其中machsoftjt.sld=‘1’和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-20 02:10:27
不需要自连接或子查询:
只需加入machsoftjt一次,然后要获得满足条件的计算机,您可以将HAVING子句与GROUP BY结合使用,以便仅检索软件为Photoshop或Word的两行连接的计算机
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,因此不需要用引号将1和2括起来。
这种方法也很灵活,因为它很容易添加/删除条件。如果您想要所有slid都为(1,2,4,8)的机器,只需调整IN子句并将HAVING子句中的COUNT(*)调高为4 (因为列表中有4个值是机器必须满足的)。
https://stackoverflow.com/questions/11106288
复制相似问题