【问题标题】:SQL-Query gives back 2 returns where it should give back oneSQL-Query 在应该返回 1 的地方返回 2 个返回
【发布时间】:2015-10-02 21:56:27
【问题描述】:

我遇到了以下问题:

我有 2 张桌子:

bestia_assets
bestia_servers_specifications

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

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

保存在资产表中。

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

喜欢:

- 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 附加到服务器的资产的用户?

这是创建表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;

这是资产表的内容:

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

【问题讨论】:

  • 您能否更新问题以包含两个表(列、键)的规范?很难说它们是如何设计的以及它们之间的关系。
  • 您好 jpw,我在帖子中添加了更多信息。我希望清楚我想要什么 :-) 简而言之:我想获取正在使用(通过assettable.asset = servertable.value)链接到特定服务器(例如ID 33)的资产的用户)

标签: mysql join left-join conditional-statements


【解决方案1】:

您得到两行的原因是您使用了左联接,并且该联接不会与 type = 'ip4' 的行匹配任何内容,这将为您提供用户 ID 的空值。

解决方案是限制加入“fqdn”的类型,因为表之间的关系似乎是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 将获得那些在资产表中没有匹配项的服务器 - 如果您只想要具有匹配项的服务器,只需省略 left 关键字。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-17
    • 1970-01-01
    • 2011-02-03
    • 1970-01-01
    • 1970-01-01
    • 2013-09-20
    • 1970-01-01
    相关资源
    最近更新 更多