对不起,如果我很难用书面形式展示,但我可以肯定地展示。

所以可以说我有这张桌子:

(`name` varchar(5), `value_name` varchar(18))
;

INSERT INTO Alarms
(`name`, `value_name`)

VALUES
('cws-1', 'linkupdown'),
('cws-1', 'linkupdown'),
('cws-1', 'performancedegrade'),
('cws-1', 'performancedegrade'),
('cws-2', 'ICMP-Ping'),
('cws-2', 'linkupdown'),
('cws-3', 'performancedegrade')
;


表格如下所示:

name      value_name
-----     ----------
cws-1     linkupdown
cws-1     linkupdown
cws-1     performancedegrade
cws-1     performancedegrade
cws-2     ICMP-Ping
cws-2     linkupdown
cws-3     performancedegrade


我想要一个查询,以排除在value_name ='cws-1'中name列中具有'linkupdown'的所有记录

因此结果将是:

name      value_name
-----     ----------
cws-1     performancedegrade
cws-1     performancedegrade
cws-2     ICMP-Ping
cws-2     linkupdown
cws-3     performancedegrade


看起来确实很简单,但是我似乎无法提出满足此结果的查询。

任何帮助表示赞赏。

最佳答案

您可以使用NOT EXISTS

SELECT name, value_name
FROM Alarms AS a
WHERE name = 'cws-1'
      AND NOT EXISTS (SELECT 1
                      FROM Alarms
                      WHERE a.name = name AND value_name =  'linkupdown')


上面的查询返回与cws-1记录没有任何关系的所有value_name='linkupdown'命名记录。

仔细查看OP中所述的所需输出,这可能是您真正想要的:

SELECT name, value_name
FROM Alarms AS a
WHERE NOT (name = 'cws-1' AND value_name = 'linkupdown')


该查询将从Alarms中选择所有记录,但不包括具有name = 'cws-1'value_name='linkupdown'的记录。

SQL Fiddle Demo

关于mysql - 连续过滤特定值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30201543/

10-11 07:50