mysql - 按非空值分组

标签 mysql sql

我有一个数据库:

+--+----+---------+
|id|name|source_id|
+--+----+---------+
|11|aaaa|null
+--+----+---------+
|12|bbbb|1
+--+----+---------+
|13|cccc|1
+--+----+---------+
|14|dddd|null
+--+----+---------+
|15|eeee|2
+--+----+---------+
|16|ffff|2
+--+----+---------+
|17|gggg|2
+--+----+---------+

我想选择所有条目,但有一个异常(exception):

  • 所有带有 source_id == somevalue(not null) 的条目都应该分组
  • last entry source_id == null 应该在之后存在

这是我期望的结果:

+----+--+----+---------+
COUNT|id|name|source_id|
+----+--+----+---------+
.....|11|aaaa|null
+----+--+----+---------+
.2...|13|cccc|1
+----+--+----+---------+
.....|14|dddd|null
+----+--+----+---------+
.3...|17|ffff|2
+----+--+----+---------+

到目前为止,我已经这样做了(注意:“change_count” = COUNT):

SELECT *, (To_days(date_expires)-TO_DAYS(NOW())) as dayDiff, COUNT(id) AS change_count FROM mytable
GROUP BY source_id 
HAVING dayDiff < 4 
ORDER BY date_created DESC

这就是我得到的:

+----+--+----+---------+
COUNT|id|name|source_id|
+----+--+----+---------+
.2...|11|aaaa|null
+----+--+----+---------+
.2...|12|bbbb|1
+----+--+----+---------+
.3...|15|eeee|2
+----+--+----+---------+

如您所见,结果有 2 个问题:

  • 条目按第一个 source_id 出现分组(应该是最后一个(最新的))
  • nulls 也被分组(不应该被分组)

我上面描述的任务是否可以完成?我该怎么做?

编辑:

SELECT *, COUNT(id) AS change_count FROM 
(SELECT *, (To_days(date_return_due)-TO_DAYS(NOW())) as dayDiff FROM mytable 
WHERE owner_id='1' 
HAVING dayDiff < 100 
ORDER BY date_created DESC) AS newtable
GROUP BY (CASE WHEN source_id IS NULL THEN id ELSE source_id END)
ORDER BY (CASE WHEN source_id IS NULL THEN 1 ELSE 0 END), date_created DESC";

最佳答案

我认为以下内容可以满足您的需求:

SELECT *, (To_days(date_expires)-TO_DAYS(NOW())) as dayDiff, COUNT(id) AS change_count
FROM mytable
GROUP BY (case when source_id is null then id else source_id end)
HAVING dayDiff < 4 
ORDER BY (case when source_id is null then 1 else 0 end), date_created DESC

它执行有条件的 group by 因此 NULL sourceids 不会被分组。然后将它们放在最后使用 order by 中的逻辑。

我不明白你所说的最后一次出现是什么意思。现在我想我可以:

SELECT coalesce(s.id, mytable.id) as id,
       max(case when s.maxid is not null and s.maxid = myable.id then mytable.name
                when s.maxid is null then NULL
                else mytable.name
           end) as name,
       (To_days(date_expires)-TO_DAYS(NOW())) as dayDiff, COUNT(id) AS change_count
FROM mytable left outer join
     (select source_id, MAX(id) as maxid
      from mytable
      where source_id is not null
      group by source_id
     ) s
     on mytable.id = s.maxid
GROUP BY (case when source_id is null then id else source_id end)
HAVING dayDiff < 4 
ORDER BY (case when source_id is null then 1 else 0 end), date_created DESC

这加入了最新记录的信息(基于最高id)。

关于mysql - 按非空值分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14987808/

相关文章:

sql - 在 SQL SERVER 中对表进行分组

c# - 另一个sql查询语句

php - 在允许图像进入 json 字符串之前检查图像是否存在?

php - 将网站从我的计算机移动到主机或服务器?

c# - 使用 MySQL 数据填充 ArrayList

php - Laravel DB::RAW 获取单个

sql - Google BigQuery 中的多级数据透视

MySQL自定义函数选择记录

php - 查询两个表的数据

mysql - Innodb_Buffer_Pool_Size 性能