【问题标题】:Returning count number from ID columns for repeated Id's从 ID 列中返回重复 ID 的计数
【发布时间】:2019-12-02 22:05:04
【问题描述】:

以下查询返回正确的结果,但是,它返回所有结果。我现在要做的是有一个列来计算在 ID 列中找到 id 的次数。这有意义吗?

这是我现在的查询。

SELECT distinct es.id,es.name,first_name,last_name
--         case when count(ea.id=es.name)>=7 then 'Yes' else 'No' 
END as 
Attended_all
--         count(es.id) as Times_checked_in
FROM    event_session_checkin esc,
        event_attendee ea,
        event_session es
 WHERE  esc.event_attendee_id = ea.id AND es.Id = 
esc.event_session_id
 -- and a.event_session_id = 'session_id' -- ska monday morning;
 AND es.event_id = 'event_id' and 
es.name like 'SKA%'
order by es.id, first_name, last_name;

查询现在正在返回这些结果。

这是结果的一个例子。

 ID             name              fname   lname
------|------------------------|-------|------
123        SKA - Monday Morn    Abby    Andrews
123        SKA - Monday Morn    Abraham Chiok
1234       SKA - Monday Morn    Addison Curles
1234       SKA - Monday Morn    Addison White
12345      SKA - Monday Morn    Addisyn Schaefer
12345      SKA - Monday Morn    Addlee  Nelson

我想要的是在末尾添加另一列,计算 ID 号出现在 ID 列中的次数?这有意义吗?

【问题讨论】:

  • 您能否在运行 SQL 之前提供示例数据?
  • 你需要阅读GROUP BYCOUNT()
  • @RiggsFolly 我知道 group by 和 count 的作用。但是我想我需要一个子查询 l。或者在这种情况下您将如何实现分组依据和计数?
  • 您目前使用的是哪个 MySQL 版本?
  • 并且还阅读了 JOIN 的文章

标签: mysql sql subquery qsqlquery


【解决方案1】:

在 MySQL 8.x 中,您可以使用 windows 函数来执行此操作。例如:

select 
  *,
  count(*) over (partition by id) as id_count
from ( -- your query enclosed as a table expression here
  SELECT distinct es.id,es.name,first_name,last_name
  --         case when count(ea.id=es.name)>=7 then 'Yes' else 'No' 
  END as 
  Attended_all
  --         count(es.id) as Times_checked_in
  FROM    event_session_checkin esc,
          event_attendee ea,
          event_session es
   WHERE  esc.event_attendee_id = ea.id AND es.Id = 
  esc.event_session_id
   -- and a.event_session_id = 'session_id' -- ska monday morning;
   AND es.event_id = 'event_id' and 
  es.name like 'SKA%'
) x
order by es.id, first_name, last_name

【讨论】:

  • 哦,我明白了,这是为 mysql 8.1 准备的
  • OVER 子句是 SQL 标准的一部分,并在 MySQL 8.x 版本中实现。该子句修改了COUNT(*) 函数,因此它在每一行而不是组上生成聚合值,就像不合格的COUNT(*) 那样。
  • 啊,明白了。我正在运行 mysql 5.1。
【解决方案2】:

一般来说,GROUP BY 不适用于(我认为)您正在尝试做的事情。那是因为fnamelname 不同,所以结果行不会相同。

如果您尝试在一个查询上完成所有操作,那么随着您添加记录,它会以指数方式变慢 - 因为它必须对每一行进行计数。

我建议使用存储过程并为每个表创建一个带有IDCount 的临时表。然后JOIN temp ON es.id = temp.id 以包括每一行的计数。

【讨论】:

  • 谢谢,我不是真的想创建一个新表,只是想查询。我可以按原样查询,然后在 excel 中排序
  • 明白我建议的是一个临时表,它只在程序运行时才存在。退出存储过程后,临时表不复存在。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-22
  • 2018-04-04
  • 2015-12-01
  • 2016-04-23
  • 1970-01-01
  • 2017-02-03
  • 2018-06-24
相关资源
最近更新 更多