我有几张桌子:
--> task: task_id, status, datetime, code
--> task_action: action_id, task_id, action_type, action_details, action_datetime
我还有一个action_type:ASSIGNED
,其JSON为action_type
:{"assigned_to": "some_email_id"}
所以我想要的是status
中task table
所有列的所有任务:PROCESSING
并且相应的action_type
为ASSIGNED
,其中包含最新日期时间,(任务可以有多个ASSIGNED
action_type)
并查询assigned_to
电子邮件ID。
只有最新的ASSIGNED action_type应与assigned_to
中的给定电子邮件ID匹配
这是我尝试过的一个查询:
select task_action.task_id
, max(action_datetime) as dt
, action_details
as adt
FROM task_action
JOIN task
on task.task_id = task_action.task_id
WHERE action_type = 'ASSIGNED'
and task.status = 'PROCESSING'
and JSON_VALUE(adt, '$.assigned_to') = 'someEmail'
GROUP
BY task_id
显然,这不起作用。我猜有些东西不见了。
答案 0 :(得分:0)
在MySQL 5.7中,您可以使用:
WHERE ... adt->>'$.assigned_to' = 'someEmail'
如果您只使用->
,则该值具有文字双引号。使用->>
获取裸值。
阅读https://dev.mysql.com/doc/refman/5.7/en/json-search-functions.html了解详情。
答案 1 :(得分:0)
问题是您在task_action中搜索具有最大日期时间的行,而不仅仅是最大值。在SQL中表达这有点复杂。您可以搜索task_action,其中不存在具有更长日期时间的其他task_action:
WITH assigned_action as (
select
task_id,
action_datetime,
action_details
from
task_action
where
action_type='ASSIGNED' and
JSON_VALUE(action_details, '$.assigned_to')='someEmail'
)
SELECT
t.task_id,
a.action_datetime as dt,
a.action_details as adt
FROM
task t inner join (
select *
from
assigned_action a1
where not exists (
select *
from assigned_action a2
where
a2.action_datetime > a1.action_datetime and
a2.task_id = a1.task_id
)
) a on t.task_id = a.task_id
WHERE
t.status='PROCESSING'