SQL-Query 返还 2 returns 应该返还 1
SQL-Query gives back 2 returns where it should give back one
我遇到了以下问题:
我得到了 2 tables:
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
但这给了我 2 个条目:
1: userid NULL serverid 33
2: userid 1 serverid 33
所以这对我来说不可用。我怎样才能让用户使用附加到服务器的资产 serverid 33
?
这是tablebestia_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;
这是创建table 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的内容:
在 server-table 中有很多关于不同服务器的信息,例如:
您得到两行的原因是您使用的是左联接,并且联接不会匹配类型为 'ip4' 的行的任何内容,这将为您提供空值用户 ID.
解决方案是限制连接到 'fqdn' 的类型,因为 table 之间的关系似乎是 asset=fqdn 值。
试试这个:
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
会得到那些在资产 table 中没有匹配的服务器 - 如果您只想要有匹配的服务器,只需省略 left
关键字。
我遇到了以下问题:
我得到了 2 tables:
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
但这给了我 2 个条目:
1: userid NULL serverid 33
2: userid 1 serverid 33
所以这对我来说不可用。我怎样才能让用户使用附加到服务器的资产 serverid 33
?
这是tablebestia_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;
这是创建table 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的内容:
在 server-table 中有很多关于不同服务器的信息,例如:
您得到两行的原因是您使用的是左联接,并且联接不会匹配类型为 'ip4' 的行的任何内容,这将为您提供空值用户 ID.
解决方案是限制连接到 'fqdn' 的类型,因为 table 之间的关系似乎是 asset=fqdn 值。
试试这个:
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
会得到那些在资产 table 中没有匹配的服务器 - 如果您只想要有匹配的服务器,只需省略 left
关键字。