什么是此任务的有效查询

时间:2016-04-25 20:15:51

标签: mysql sql

我有一个看起来像这样的数据文件

item_id  |  status
1        | null
2        | null
2        | new
3        | new
4        | null
4        | new
5        | null

请注意,第2项和第4项同时具有2种状态:null和new。 我想创建一个只提取1状态的item_id的查询,该状态为null。所以,我希望我的查询只提取1和5.

我最终做到了这一点,但这看起来效率不高:

1.列出状态为空的项目

create table query_1 as
select * from table1 where status = 'null';

2.具有新状态的列表项

create table query_2 as
select * from table1 where status = 'new';

3.从查询1中选择所有结果,不包括从查询2的结果中找到的任何ID

select * from query_1 where item_id not in (select item_id from query_2)

我在想这个吗?是否有更简单的查询可以实现此目的?

5 个答案:

答案 0 :(得分:1)

首先,您必须使用IS NULL检查空值。 =null='null'无法正常工作。

SELECT item_id, MAX(status)
FROM table1 
GROUP BY item_id
HAVING MAX(status) IS NULL

答案 1 :(得分:0)

选择item_id 来自table1 按item_id分组 有count(*)= 1且状态为空

答案 2 :(得分:0)

SELECT item_id FROM items
WHERE status IS NOT NULL
    AND item_id NOT IN 
        (SELECT item_id FROM items 
            WHERE status IS NULL
        )

答案 3 :(得分:0)

您可以使用self-join。您需要做的是删除具有new值的item_id。您想要的其余条目。因此,您可以将查询框架化为:

SELECT  item_id,
        status
FROM    tableName
WHERE   item_id NOT IN (SELECT  item_id
                        FROM    #tab
                        WHERE   status = 'new')

你可以在这里看到 - > SQL Fiddle Example

答案 4 :(得分:-1)

您可以在此实例中使用DISTINCT

SELECT DISTINCT item_id FROM items WHERE status IS NULL;