如果值为空,请不要分组

时间:2012-02-08 12:29:46

标签: mysql

我的表格中包含以下值:

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行)的行进行分组的查询吗?

4 个答案:

答案 0 :(得分: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 

答案 1 :(得分:0)

只需添加此WHERE子句:

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

答案 2 :(得分:0)

您不需要对它们进行分组 - 您只需要执行SELECT DISTINCT。像这样:

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

你想要空字段吗?

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

请详细说明一些细节 - 可能并不完全符合您的需求。

答案 3 :(得分: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