2012-02-08 84 views
2

我有一个表中包含的值:不群,如果值为空

row item_id device_token 
1  1   1234 
2  2   2345 
3  1   
4  2   
5  1   
6  1   1234 

我想选择所有的值,但它们分组由ITEM_ID和device_token。

SELECT ITEM_ID,device_token FROM命中GROUP BY ITEM_ID,device_token

分组上述数据将导致4行,如1,6-行和3,5-将被合并。我可以做一个查询,它不会将device_token为空/行的行(第3行和第5行)分组吗?

+0

通过device_token进行分组应该产生3行。 1234,2345,空 - 不是4. – 2012-02-08 12:32:00

+0

@MarcB:'GROUP BY item_id,device_token' - 它真的是四行 – 2012-02-08 12:38:39

+0

为什么你想要这样的结果?第3行与第5行有何不同? (除了你不想得到的'row'值?) – 2012-02-08 12:44:08

回答

7

如果您不希望device_token为空的行很容易 - 只需像其他人所建议的那样使用简单的WHERE子句。

如果您想同时拥有两个,那些匹配device_token的组合以及没有设备令牌的单行,则可以将两个查询与UNION组合在一起。还有其他的可能性,但这些相当复杂。

在这里看到:

SELECT item_id, device_token 
    FROM hits 
    WHERE device_token IS NOT NULL 
    GROUP BY item_id, device_token 
UNION ALL 
SELECT item_id, device_token 
    FROM hits 
    WHERE device_token IS NULL 
0

只需添加这WHERE条款:

SELECT item_id, device_token FROM hits WHERE device_token IS NOT NULL GROUP BY item_id, device_token 
0

你并不需要将它们分组 - 你只需要做SELECT DISTINCT。像这样:

SELECT DISTINCT item_id, device_token FROM hits WHERE device_token IS NOT NULL 

你想让空字段出现吗?

您是否有其他可能需要分组的聚合字段?

请指定一些更多细节 - 也许这不完全是你需要的。

0

如果你真的想这样,并下令,尝试这样的事情。

SELECT item_id, device_token 
FROM (
    SELECT item_id, device_token 
    FROM hits 
    WHERE device_token IS NOT NULL 
    GROUP BY item_id, device_token 

    UNION ALL 

    SELECT item_id, device_token 
    FROM hits 
    WHERE device_token IS NULL 
) AS a 
ORDER BY item_id, device_token