Mysql 如何通过union查找非空列?

Mysql 如何通过union查找非空列?,mysql,Mysql,我有三张表格: 1.餐桌上的人 id, others 1, x 2, y 3, z 4, w 2.表跟踪,外键(person\u id)引用person(id) 3.table followup_轨道,外键(fid)参考followup(id) 现在我想找到每个人的所有最后一个ftime,并且在followup和/或followup_track中的详细信息不为空 我想要得到的结果是(这里的pid是个人id): 因为没有detalis!=person.id=4时为NULL,因此结果不需要pid=

我有三张表格:

1.餐桌上的人

id, others
1, x
2, y
3, z
4, w
2.表跟踪,外键(
person\u id
)引用
person
id

3.table followup_轨道,外键(
fid
)参考
followup
id

现在我想找到每个人的所有最后一个ftime,并且在followup和/或followup_track中的详细信息不为空

我想要得到的结果是(这里的pid是个人id):

因为没有detalis!=person.id=4时为NULL,因此结果不需要pid=4

因为person.id=1的最后一次时间是“2018-05-07”,所以需要该列

我创建的视图如下所示:

CREATE VIEW view_full_flup AS
SELECT
  p.id AS pid, fp.ftime, fp.details
FROM
  ((followup_track fp
    LEFT JOIN followup ON (fp.fid = followup.id))
    LEFT JOIN person p ON (followup.person_id = p.id))
WHERE
  fp.details IS NOT NULL
UNION
SELECT
  f.person_id AS pid, f.ftime, f.details
FROM
  followup f
WHERE
  f.details IS NOT NULL
然后,我使用sql:

     SELECT *, MAX(`ftime`) FROM view_full_flup GROUP BY pid;

请问我的解决方案对吗?细节无法编制索引,速度较慢。如何做到这一点呢?

您不能选择star group by(好吧,您可以在MySQL中选择star group by,这取决于它的设置方式,但这不是sql技能可移植性的好习惯),您必须在select中指定列列表,并将它们分组(将列名放入group by中)或聚合它们(将列名传递到聚合函数中)

感觉好像左连接逻辑颠倒了-person是您知道的唯一一个有记录的表,所以它应该在连接的左侧。其他表可能是无记录的

这是我的问题,我会写得更像:

select
  Pid,
  Max(case when ft.ftime > f.ftime then ft.ftime else f.ftime end) maxft
From
  Person p
  Left join (select * from followup where details is not null) f on f.person_id = p.id
  Left join (select * from follup_track where details is not null) ft on ft.fid = f.id
Group by pid
我们只需加入一次表集合,已经过滤了其中任何一个表的详细信息存在的记录,然后从任何一个表中获取最大日期

请注意,如果您有日期列为空的记录(即使填写了详细信息),则此查询可能返回空日期。如果不需要这些记录,请使用HAVING进行筛选,或者使用where将整个内容包装到另一个select中并进行筛选

目前,这个查询似乎并不特别有用,因为虽然你知道最近的日期,但你没有任何其他数据。如果这是你想知道的(我无法从你的原始帖子中分辨出来,因为描述和查询与他们所说的不一致)很好,但是如果您需要其他信息,那么使用mysql 8的新分析查询可能更适合:

Select * from
(
 select
  Pid,
  Row_number over(partition by pid order by (case when ft.ftime > f.ftime then ft.ftime else f.ftime end) desc) rown 
 From
  Person p
  Left join (select * from followup where details is not null) f on f.person_id = p.id
  Left join (select * from follup_track where details is not null) ft on ft.fid = f.id
) a where rown = 1

我假设您不能修改表,对吗?因为我认为可以使您的查询更简单、更快的第一件事就是修改该结构。@Erubiel谢谢。是的,我不能修改我的表,只能创建一些视图。更新您的问题添加适当的数据示例和预期的结果result@scaisEdge对不起,我放了一些数据刚才的结果和结果。谢谢。如果有人没有后续行动,我不需要详细信息。如果有后续行动(详细信息不为空),但没有后续行动跟踪,我只需要后续行动的详细信息。该人的数量~3500,每年,我们每个人有4次后续行动,那么,可能是2次(可能是0)followup\u跟踪每一次跟踪。那么,您是每次查询特定人员的数据库,还是为所有人员生成一份报告?从周三到周六,每天查询45-90人,其他时间每天查询30人。但是每个星期的人员都不一样。因此,周三您是否将以每人一人的方式运行45次查询每次查询中都有一个son ID,还是你想运行一次报告,让它生成一个包含45人的输出?周三,工作人员必须至少跟踪45人,这些人是随机的。现在我想,也许我需要一个过程,所以它只需按45个ID查找ftime,详细信息。这是正确的方法吗?
     SELECT *, MAX(`ftime`) FROM view_full_flup GROUP BY pid;
select
  Pid,
  Max(case when ft.ftime > f.ftime then ft.ftime else f.ftime end) maxft
From
  Person p
  Left join (select * from followup where details is not null) f on f.person_id = p.id
  Left join (select * from follup_track where details is not null) ft on ft.fid = f.id
Group by pid
Select * from
(
 select
  Pid,
  Row_number over(partition by pid order by (case when ft.ftime > f.ftime then ft.ftime else f.ftime end) desc) rown 
 From
  Person p
  Left join (select * from followup where details is not null) f on f.person_id = p.id
  Left join (select * from follup_track where details is not null) ft on ft.fid = f.id
) a where rown = 1