Php 从同一列等于两个不同内容的表中进行选择?
我有一个有16个表的数据库,但只有4个表与此相关。数据库跟踪不同的服务器、服务器信息(CPU、RAM、IP地址等)及其运行的软件。软件和机器通过联接表进行关联Php 从同一列等于两个不同内容的表中进行选择?,php,mysql,Php,Mysql,我有一个有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,sl
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,SLIDE是软列表表中的软件列表id(一个仅列出正在运行的软件的表,用于唯一约束,以便在执行软件升级时,我没有一台计算机运行同一软件的两个不同版本的条目)。因此,如果我有运行Microsoft Word 2010(sid为1,Slide为1)和Adobe Photoshop 5的machine1(mid为1)(如果sid为2,Slide为2),则该表将
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'
当我运行此查询时,我没有得到任何回复。当我运行此查询时,我没有得到任何回复。我现在被难住了,无法想出任何其他方法。非常感谢所有帮助。由于这行代码,它失败了: 其中machsoftjt.slide='1'和machsoftjt.slide='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)
这需要自联接。大致如下:
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中的相关列别名,不需要自联接或子查询: 只需将
machsoftjt
连接一次,然后为了使机器满足所有条件,您可以将HAVING
子句与groupby
结合使用,仅检索两行连接的机器,其中软件为Photoshop或Word:
另外,由于slided
属于INT
类型,因此1
和2
周围不需要引号
这种方法也很灵活,因为它很容易添加/删除条件。如果您想要所有的
滑动的s(1,2,4,8),只需调整in
子句中的并将HAVING
子句中的计数(*)
增加到4
(因为列表中有4个值机器必须满足).请提供机器和软件的表格布局。谢谢。这非常有效!如果我想同时返回这两个(或无论我选择了多少个-现在最多6个)呢软件名称和版本?@ubuntu72——看看我的新编辑。应该会给你一些基本的想法。谢谢!!工作原理和我想要的完全一样。当我想要两个以上的时候,我只做和s3一样的事情,等等?谢谢,这也很好!如果我想同时返回这两个(或者无论我选择了多少个-现在最多6个)呢软件名称和版本?谢谢,这也很好!如果我想同时返回这两个软件名称和版本(或者无论我选择了多少个,现在最多6个),该怎么办?
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