首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从同一列等于两个不同事物的表中进行选择?

从同一列等于两个不同事物的表中进行选择?
EN

Stack Overflow用户
提问于 2012-06-20 01:35:17
回答 3查看 728关注 0票数 0

我有一个数据库,其中有16个表,但只有4个与此相关。该数据库跟踪不同的服务器、服务器信息(CPU、RAM、IP地址等)及其运行的软件。软件和机器通过一个连接表联系在一起。

代码语言:javascript
运行
复制
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是machines表中的机器id,sid是软件表中包含软件名称和软件版本的软件id,slid是softlist表中的软件列表id (该表只列出正在运行的软件,并用于唯一约束,因此当执行软件升级时,我没有运行同一软件的两个不同版本的一台机器的条目)。因此,如果我有运行Microsoft word2010( sid为1,slid为1)和Adobe Photoshop 5( sid为2,slid为2)的machine1 ( mid为1),该表将为

代码语言:javascript
运行
复制
mid  sid   slid
1    1     1
1    2     2

我要从此表中选择同时运行Microsoft Word和Adobe Photoshop的所有计算机。

代码语言:javascript
运行
复制
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我运行这个查询,我没有得到任何东西。现在我被难住了,什么也想不出来了。所有的帮助都将不胜感激。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-06-20 01:45:12

这需要一个自连接。大致如下:

代码语言:javascript
运行
复制
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'

要获取软件名称,大致如下:

代码语言:javascript
运行
复制
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中的相关列添加别名

票数 3
EN

Stack Overflow用户

发布于 2012-06-20 01:42:04

它之所以失败,是因为下面这行:

其中machsoftjt.sld=‘1’和machsoftjt.slid='2‘

machsoftjt不能同时等于1和2;因此您没有得到任何结果。

您必须分别查询每个包。

我认为像这样的东西应该可以做到:

代码语言:javascript
运行
复制
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)
票数 2
EN

Stack Overflow用户

发布于 2012-06-20 02:10:27

不需要自连接或子查询:

只需加入machsoftjt一次,然后要获得满足条件的计算机,您可以将HAVING子句与GROUP BY结合使用,以便仅检索软件为Photoshop或Word的两行连接的计算机

代码语言:javascript
运行
复制
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子句并将HAVING子句中的COUNT(*)调高为4 (因为列表中有4个值是机器必须满足的)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11106288

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档