Mysql 如何从SQL中获取仅以特定值出现的条目?
我需要在我的SQL表中找到总是并且只出现在特定值中的条目 例如:Mysql 如何从SQL中获取仅以特定值出现的条目?,mysql,sql,Mysql,Sql,我需要在我的SQL表中找到总是并且只出现在特定值中的条目 例如: DeviceID Transmission -------- ------------ 000329 Inventory 000980 Inventory 004406 Starting 000980 Stopping 000329 Inventory 004406 Inventory 现在我需要找到所有只有库存传输且从不启动或停止的设备ID。在本例中,00
DeviceID Transmission
-------- ------------
000329 Inventory
000980 Inventory
004406 Starting
000980 Stopping
000329 Inventory
004406 Inventory
现在我需要找到所有只有库存传输且从不启动或停止的设备ID。在本例中,000329.非常简单:
-- You didn't give a name for your table
SELECT DeviceID from YourTable WHERE Transmission = 'Inventory'
取决于您想要什么(如果您有更多的
传输值)
或
您可以使用不存在
排除同样具有启动或停止功能的设备ID
select DeviceID
from tablename t1
where not exists (select 1 from tablename t2
where t1.DeviceID = t2.DeviceID
and t2.Transmission in ('Starting','Stopping'))
and t1.Transmission = 'Inventory'
如果只有这三个状态具有以下名称(“库存”、“开始”、“停止”),则可以使用:
select deviceID from table1
group by deviceID
having max(transmission)='Inventory'
此处使用max是有效的,因为的“开始”、“停止”按字母顺序排列在的“库存”之后
结果是正确的000329您可以选择所有传输='Inventory'
ID,并过滤掉传输中存在的('Starting'、'Stopping')
:
SQL Fiddle:您可以像这样使用分组方式和拥有
查询
SELECT DeviceID
FROM DevicesTable
GROUP BY DeviceID
HAVING SUM(CASE WHEN Transmission = 'Inventory' THEN 1 ELSE 0 END) > 1
AND SUM(CASE WHEN Transmission <> 'Inventory' THEN 1 ELSE 0 END) = 0
如果您只想检查中的传输('Starting','Stopping')
,您可以添加中的传输('Starting','Stopping')
,而不是第二个条件聚合中的传输“Inventory”
。试试这个
select *
from tablename
where DeviceID not in
(select DeviceID from tablename
where Transmission in('Starting','Stopping'))
and Transmission='Inventory';
不启动或停止…………或……=传输。。。。哪一个?不同的是,您没有主键。这(可能)有问题!!您忘记了“从不启动或停止”部分。@jarlh但如果是“库存”,则不能是任何其他东西(启动或停止),包括嗯,机智,但有限。而且可能是灾难性的!不幸的是,这对我不起作用,可能是因为我有更多的传输条目按字母顺序排在清单之前?@草莓:;)您是对的,但是关于传输名称的问题是有限的。@tom:您的完整传输列表是什么?或者您是否有此传输名称的数字ID?您的答案是正确的,但是,group by
具有条件的具有
会更快。即使DeviceID和Transmission都被索引?如果不存在
,该表将被查找两次。使用分组方式
和具有
,则只会发生一次。和t1.传输=“库存”
也不需要这种情况op@AmeyaDeshpande,只是想确保“只有库存传输,从不启动或停止”。(表中可能还有其他值未在样本数据中显示…)您的答案与@ughai发布的答案非常相似,最大的区别在于我使用distinct
以避免重复。jarlh的答案使用joint1.DeviceID=t2.DeviceID
在他的不存在
子句中,而我的则不存在。distinct
不是一个函数,因此paren一事无成。事实上,你真的不需要它。
select distinct(DeviceID) from YourTable
WHERE Transmission = 'Inventory'
and DeviceID not in
( select distinct(DeviceID) from YourTable
WHERE Transmission in('Starting', 'Stopping')
);
SELECT DeviceID
FROM DevicesTable
GROUP BY DeviceID
HAVING SUM(CASE WHEN Transmission = 'Inventory' THEN 1 ELSE 0 END) > 1
AND SUM(CASE WHEN Transmission <> 'Inventory' THEN 1 ELSE 0 END) = 0
DeviceID
000329
select *
from tablename
where DeviceID not in
(select DeviceID from tablename
where Transmission in('Starting','Stopping'))
and Transmission='Inventory';