Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 从同一列等于两个不同内容的表中进行选择?_Php_Mysql - Fatal编程技术网

Php 从同一列等于两个不同内容的表中进行选择?

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

我有一个有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,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