Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何从SQL中获取仅以特定值出现的条目?_Mysql_Sql - Fatal编程技术网

Mysql 如何从SQL中获取仅以特定值出现的条目?

Mysql 如何从SQL中获取仅以特定值出现的条目?,mysql,sql,Mysql,Sql,我需要在我的SQL表中找到总是并且只出现在特定值中的条目 例如: DeviceID Transmission -------- ------------ 000329 Inventory 000980 Inventory 004406 Starting 000980 Stopping 000329 Inventory 004406 Inventory 现在我需要找到所有只有库存传输且从不启动或停止的设备ID。在本例中,00

我需要在我的SQL表中找到总是并且只出现在特定值中的条目

例如:

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的答案使用join
t1.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';