当前位置: 首页 > 知识库问答 >
问题:

mysql - 如何优雅地根据MySQL的main和handle表判断事件处理进度?

长孙阳焱
2024-07-10

我的MYSQL现在有两张表,一张表记录的是需要处理的事件,我们把他称之为main,另一张表是处理结果,我们把他称之为handle。

main和handle之间通过'ticket_id'这个字段确定归属关系,但是ticket_main有一个'ticket_status'字段来确定处理的状态,但是ticket_handle里面的被指定处理人可能会不止一个人,那么每一个被指定的处理人都会在handle表中预先生成一条空白处理结果,方便进行提示,一旦处理完,更新handle表中的内容。

那我应该如何来判断这个事件现在的处理进度?有四种状态,待审核、待处理、待销号、已销号,其他三种都可以通过main字段内容去判断,非常简单。但是“待销号”这个应该是所有人都处理完了,但是还没有确认结果的时候显示。

我应该如何优雅的处理这种显示?
可能有用的字段如下
main: ticket_id, ... , ticket_status, update_time
handle: ticket_id, ... , ticket_handler, ticket_result, update_time

main:
| ticket_id | ticket_status | update_time
| 10000 | TODO | 2024-07-10 11:12:13

handle:
| ticket_id | handle_id | ticket_handle | ticket_result | update_time
| 10000 | 10001 | 张三 | null | null
| 10000 | 10002 | 李四 | 处理结果 | 2024-07-10 12:00:05
或者我应该如何设计数据库,才能实现这个功能?

我试着每次更新处理结果的时候都通过ticket_id把handle表中的所有相同id的内容都拿出来,检查ticket_result是否有内容,如果都有则更新main表中ticket_status字段的内容。
但是这样相当于一次操作进行了3次对表的操作,显得不是很聪明的样子。

共有1个答案

丁兴德
2024-07-10

要优雅地处理这种显示,你可以使用SQL查询来结合mainhandle表,并基于handle表中的ticket_result字段是否都已填写来判断“待销号”状态。这里有一个可能的SQL查询方法,用来判断某个ticket_id是否满足“待销号”状态:

SELECT 
    m.ticket_id,
    m.ticket_status,
    CASE 
        WHEN m.ticket_status IN ('TODO', 'IN_PROGRESS', 'APPROVED') THEN m.ticket_status -- 假设其他三种状态在main表中直接判断
        WHEN COUNT(DISTINCT CASE WHEN h.ticket_result IS NOT NULL THEN h.ticket_handler ELSE NULL END) = COUNT(DISTINCT h.ticket_handler) THEN 'APPROVED_BUT_NOT_CLOSED' -- 如果所有处理人都有结果,则为'待销号'
        ELSE 'PENDING' -- 其他情况可能是'待处理'或其他中间状态
    END AS current_status
FROM 
    main m
LEFT JOIN 
    handle h ON m.ticket_id = h.ticket_id
GROUP BY 
    m.ticket_id, m.ticket_status;

注意:

  1. 上面的查询假设main表中ticket_status字段除了'TODO'、'待处理'、'待销号'、'已销号'之外,还有一个'APPROVED'状态表示所有处理人已处理完成但尚未确认结果(或者你可以根据实际需要命名为'待销号')。
  2. CASE语句中,我们使用COUNT(DISTINCT ...)来确保我们计算的是不同的处理人,并且只计算那些已经填写了ticket_result字段的处理人。
  3. 你可以根据main表中实际的ticket_status字段值来调整CASE语句中的条件。
  4. 查询返回的current_status是一个基于查询逻辑计算出的状态,而不是main表中的实际状态。如果需要将这个状态更新回main表,你确实需要执行额外的UPDATE操作,但这可以在需要更新状态时才进行,而不是每次处理结果更新时都进行。
  5. 如果main表中没有'APPROVED'这样的中间状态,并且你希望基于handle表来动态计算状态,那么你可以考虑在应用程序逻辑中处理这种状态计算,而不是在数据库中。
  6. 为了优化性能,你可能需要为ticket_idmainhandle表上建立索引,以确保JOIN操作的高效性。
  7. 这种方法假设你已经有了处理逻辑来确保当所有处理人都完成工作时,ticket_result字段会被填写。如果这不是情况,你可能需要额外的逻辑来确保这一点。

最后,如果你发现经常需要基于handle表来更新main表的状态,并且这成为性能瓶颈,那么你可能需要重新考虑你的数据库设计或应用逻辑,以便更有效地处理这种依赖关系。

 类似资料:
  • 让我们假设我们有这样一个用python编写的琐碎守护进程: 我们使用< code>start-stop-daemon对其进行守护,默认情况下,它会在< code> - stop上发送< code > SIGTERM (< code > TERM )信号。 假设当前执行的步骤是。此时我们正在发送信号。 发生的情况是执行立即终止。 我发现我可以使用<code>signal.signal(signal.

  • 问题内容: 我正在处理一个将文件附加到电子邮件的PHP表单,并试图妥善处理上传的文件太大的情况。 我了解到,其中有两个设置会影响文件上传的最大大小:和。 如果文件的大小超过,PHP会将文件的大小返回为0。我可以检查一下。 但是,如果超出了范围,我的脚本将以静默方式失败并返回空白表格。 有什么办法可以捕捉到此错误? 问题答案: 从文档中: 如果发布数据的大小大于post_max_size,则 $ _

  • 问题内容: 假设我们有一个用python编写的琐碎守护程序: 我们将它守护起来,默认使用它发送信号–。 假设当前执行的步骤是。此时此刻,我们正在发送TERM信号。 发生的情况是执行立即终止。 我发现我可以使用处理信号事件,但事实是它仍然会中断当前执行并将控制权传递给。 因此,我的问题是-是否可以不中断当前执行,而是TERM在单独的线程(?)中处理信号,以便能够进行设置,从而有机会优雅地停止运行?

  • 问题内容: 我发现几乎每个教程都告诉我针对事件循环执行此操作: 但是,单击X关闭程序会出现此消息。 这些示例建议使用无限循环,这的确使我感到奇怪。这听起来不自然,而我的其他X11程序也没有这样做。所以我四处搜寻。我发现了如何捕获窗口关闭事件。 那个有效。它退出没有错误。…但是我拒绝相信这是正常的做事方式。我的意思是,这是正确退出X11应用程序的唯一方法吗?捕获结束事件似乎需要做很多工作。如何进行“

  • 让我们假设我们有这样一个用java编写的普通守护进程: 我们使用 来守护它,默认情况下,它会在 上发送 (TERM) 信号 假设当前执行的步骤是#2,此时我们正在发送项信号。 发生的情况是执行立即终止。 我发现我可以使用<code>addShutdownHook()</code>处理信号事件,但问题是它仍然会中断当前的执行,并将控制传递给处理程序: 所以,我的问题是——有没有可能不中断当前的执行,

  • 我最近在我的Spring4/Hibernate Web应用程序中实现了Spring Security来处理登录/退出和不同的用户角色。 经过大量阅读,它现在似乎工作得很好,但我注意到,由于错误的Spring Security配置而引发的异常没有使用我的自定义处理程序进行优雅的处理,而是显示为一个丑陋的Tomcat错误页面(显示HTTP状态500-UserDetailsService是必需的,后跟一

  • 问题内容: 如何在Linux和Windows中正常停止Java进程? 什么时候被调用,什么时候不被调用? 终结器又如何呢? 我可以从外壳向Java进程发送某种信号吗? 我正在寻找最好的便携式解决方案。 问题答案: 在所有未强制终止VM的情况下,都会执行关机挂钩。因此,如果要发出“标准” kill(通过kill命令),则它们将执行。同样,它们将在调用后执行。 但是强行杀死(或),然后它们将不会执行。

  • 问题内容: 通过 设计, 人们只能将访问权限限制为仅通过身份验证的用户。 无论如何,当 未经 身份 验证的 用户尝试访问受限页面时,devise会自动导致重定向到 登录 页面。 因此,尝试打开http:// localhost:3000 / users / edit 将导致重定向到http:// localhost:3000 / users / sign_in 。 现在,如果我将链接http://