SQL-Query返回2个返回值,它应该返回一个返回值

时间:2015-07-14 10:08:25

标签: mysql join left-join conditional-statements

我遇到了以下问题:

我有两张桌子:

bestia_assets
bestia_servers_specifications

在我的资产中,有很多关于用户使用过的服务器的信息。例如:

- User: 1 - Asset: example.com
- User: 1 - Asset: example.org

保存在assets-table中。

在servers-table中,我存储有关服务器本身的信息。

像:

- Serverid 33 - FQDN: example.com
- Serverid 33 - IP: 123.123.123.212
- Serverid 34 - FQDN: example.org
- Serverid 34 - IP: 212.212.212.123

等等

现在我想让所有使用ID为33的服务器的用户

我的第一次尝试:

SELECT * FROM (SELECT a.userid, s.serverid
FROM  bestia_servers_specifications as s
LEFT JOIN bestia_assets as a
ON a.asset = s.value) as servers
WHERE servers.serverid = 33
GROUP BY servers.userid

但是这给了我两个条目:

1: userid NULL serverid 33
2: userid 1 serverid 33

所以这对我来说无法使用。如何让使用附加到服务器的资产的用户serverid 33

这是表bestia_servers_specifications

的创建
CREATE TABLE `bestia_servers_specifications ` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
    `serverid` int(10) DEFAULT NULL,
    `type` varchar(250) NOT NULL DEFAULT '',        
    `value` varchar(250) NOT NULL DEFAULT '',       
    PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;

这是表bestia_assets

的创建
CREATE TABLE `bestia_assets ` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
    `userid` int(10) DEFAULT NULL,
    `type` varchar(250) NOT NULL DEFAULT '',        
    `asset` text,
    PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;

这是assets-table的内容:

enter image description here

在服务器表中有很多关于不同服务器的信息,如下所示: enter image description here

1 个答案:

答案 0 :(得分:2)

您获得两行的原因是您正在使用左连接,并且该连接不会匹配任何类型=' ip4'这将为userid提供一个空值。

解决方案是限制加入' fqdn'因为表之间的关系似乎是asset = fqdn value。

请改为尝试:

SELECT a.userid, s.serverid
FROM bestia_servers_specifications as s
LEFT JOIN bestia_assets as a
ON a.asset = s.value
WHERE s.serverid = 33 AND s.type = 'fqdn'

使用left join可以获得资产表中没有匹配项的服务器 - 如果您只想要匹配的服务器,只需省略left关键字。