MySQL通过group by检索JOIN中的最后一条记录
我有以下数据表: 1.表格MySQL通过group by检索JOIN中的最后一条记录,mysql,join,group-by,Mysql,Join,Group By,我有以下数据表: 1.表格跟进as: mysql> select * from follow_up; +--------------+----------------+--------------------------------------------------+-------------------+---------+---------------+-----------+---------------+----------+ | follow_up_id | feedback_
跟进as:
mysql> select * from follow_up;
+--------------+----------------+--------------------------------------------------+-------------------+---------+---------------+-----------+---------------+----------+
| follow_up_id | feedback_close | feedback_open | is_email_required | is_Open | reminder_date | client_id | conclusion_id | stage_id |
+--------------+----------------+--------------------------------------------------+-------------------+---------+---------------+-----------+---------------+----------+
| 1 | NULL | dsffsdfsdfsd | 1 | 1 | 2017-09-20 | 101 | 96 | 72 |
| 2 | NULL | FSGDFHFGHFG | 1 | 1 | 2017-09-28 | 101 | 251 | 72 |
| 3 | NULL | Tender stage fb | 0 | 1 | NULL | 101 | 98 | 163 |
| 4 | NULL | Call back tender stage update date from 28 to 30 | 1 | 1 | 2017-09-28 | 101 | 96 | 163 |
| 5 | NULL | Metting follow up for next meeting | 1 | 1 | 2017-10-02 | 101 | 96 | 73 |
+--------------+----------------+--------------------------------------------------+-------------------+---------+---------------+-----------+---------------+----------+
2。表日志为:
mysql> SELECT * from logs where transaction = 'FLWUP';
+---------+---------+---------------------+---------+-------------+
| user_id | menu_id | logs_time | tran_id | transaction |
+---------+---------+---------------------+---------+-------------+
| 84 | 69 | 2017-09-19 19:31:04 | 1 | FLWUP |
| 84 | 69 | 2017-09-19 19:31:25 | 2 | FLWUP |
| 84 | 69 | 2017-09-20 19:10:41 | 2 | FLWUP |
| 84 | 69 | 2017-09-21 12:35:01 | 3 | FLWUP |
| 84 | 69 | 2017-09-21 12:35:26 | 4 | FLWUP |
| 84 | 69 | 2017-09-21 12:36:16 | 4 | FLWUP |
| 84 | 69 | 2017-09-21 12:38:30 | 5 | FLWUP |
+---------+---------+---------------------+---------+-------------+
7 rows in set (0.00 sec)
3。表allcode
as:
mysql> select * from allcode where code_type like 'MARK%';
+------------------+---------+------+----------------------+
| code_type | code_id | srno | code_name |
+------------------+---------+------+----------------------+
| MARKETING_STAGES | 72 | 1 | Enquiry |
| MARKETING_STAGES | 73 | 3 | Meeting |
| MARKETING_STAGES | 74 | 4 | Presentation |
| MARKETING_STAGES | 163 | 2 | Tender |
+------------------+---------+------+----------------------+
11 rows in set (0.00 sec)
我调用了一个查询,结果如下:
mysql> select f.follow_up_id,f.feedback_open, f.feedback_close, f.reminder_date,
ast.code_name as stage, ac.code_name as conclusion, max(l.logs_time)
from follow_up f
join logs l on l.tran_id = f.follow_up_id
join allcode ast on ast.code_id = f.stage_id
join allcode ac on ac.code_id = f.conclusion_id
where l.transaction='FLWUP' and f.client_id = 101
group by ast.code_name order by ast.srno;
+--------------+------------------------------------+----------------+---------------+---------+------------+---------------------+
| follow_up_id | feedback_open | feedback_close | reminder_date | stage | conclusion | max(l.logs_time) |
+--------------+------------------------------------+----------------+---------------+---------+------------+---------------------+
| 1 | dsffsdfsdfsd | NULL | 2017-09-20 | Enquiry | Call Back | 2017-09-20 19:10:41 |
| 3 | Tender stage fb | NULL | NULL | Tender | Next | 2017-09-21 12:36:16 |
| 5 | Metting follow up for next meeting | NULL | 2017-10-02 | Meeting | Call Back | 2017-09-21 12:38:30 |
+--------------+------------------------------------+----------------+---------------+---------+------------+---------------------+
3 rows in set (0.00 sec)
但我希望结果是:
+--------------+-----------------------------------------------------+----------------+---------------+---------+------------+---------------------+
| follow_up_id | feedback_open | feedback_close | reminder_date | stage | conclusion | max(l.logs_time) |
+--------------+-----------------------------------------------------+----------------+---------------+---------+------------+---------------------+
| 2 | FSGDFHFGHFG | NULL | 2017-09-20 | Enquiry | Call Back | 2017-09-20 19:10:41 |
| 4 | Call back tender stage update date from 28 to 30 | NULL | NULL | Tender | Next | 2017-09-21 12:36:16 |
| 5 | Metting follow up for next meeting | NULL | 2017-10-02 | Meeting | Call Back | 2017-09-21 12:38:30 |
+--------------+-----------------------------------------------------+----------------+---------------+---------+------------+---------------------+
3 rows in set (0.00 sec)
我无法加入并分组以获得所需的结果
表随访的结论id
列和阶段id
是指表所有代码的代码id
问题:
我想要的结果是
分组依据阶段id
所有代码的排序依据srno
,以及
上次/最近的follow\u-up\u id
的follow\u-up
表
包括我的答案,需要的完整分组的原始问题,以及演示中Reupal的答案。您缺少conclusionID的示例数据中的值,所以我只是基于ID创建了它们(现在更新为ISO,但缺少98)
在本专栏中,我的结果与你的不匹配;但我相信你的预期结果是错误的
当存在多个stage\u ID时,似乎需要每个stage\u ID的max follow\u up\u ID
这可以通过派生表/内联视图来处理,该派生表/内联视图获取按stage\u ID分组的max follow\u UP\u ID,并将其连接回您的集合。将结果限制为仅包括每个阶段ID的最大后续ID
我也不喜欢mySQL的扩展GROUPBY,我更喜欢在GROUPBY中包含select中未聚合的所有列。使用扩展的分组方式往往会隐藏潜在的问题。在这种情况下,仅通过ast.code_名称进行分组允许引擎从其他列中选择一个非不同的值。您最终没有得到所需的结果,而且它隐藏了这样一个事实:如果不是由于使用/误用扩展组,您将在查询中获得多条记录
SELECT f.follow_up_id,f.feedback_open, f.feedback_close, f.reminder_date,
ast.code_name as stage, ac.code_name as conclusion, max(l.logs_time)
from follow_up f
join logs l on l.tran_id = f.follow_up_id
join allcode ast on ast.code_id = f.stage_id
join allcode ac on ac.code_id = f.conclusion_id
JOIN SELECT max(follow_up_ID) MFID, stage_ID
FROM follow_up
GROUP BY stage_ID) Z
on f.follow_up_ID = Z.MFID
and F.Stage_ID = Z.Stage_ID
WHERE l.transaction='FLWUP' and f.client_id = 101
GROUP BY f.follow_up_id,f.feedback_open, f.feedback_close, f.reminder_date,
ast.code_name , ac.code_name
ORDER BY ast.srno;
请尝试下面的内容,注意顺序并按顺序分组
select f.follow_up_id,f.feedback_open, f.feedback_close, f.reminder_date,
ast.code_name as stage, ac.code_name as conclusion, max(l.logs_time)
from follow_up f
join logs l on l.tran_id = f.follow_up_id
join allcode ast on ast.code_id = f.stage_id
join allcode ac on ac.code_id = f.conclusion_id
where l.transaction='FLWUP' and f.client_id = 101
group by follow_up.stage_id order by ast.srno, follow_up.follow_up_id DESC;
这应该是可行的,如果不是这样,那么您应该搜索如何设置多列的顺序
参考文章-所有代码都是跟进表的父表吗?在“跟进”表的“跟进id”列上设置顺序不是一件坏事,但请看:我真的不理解父子关系,但是stage\u id
和conclusion\u id
的follow\u-up
表格只不过是code\u id
的allcode
@Rupal我在这里输入的结果,所以我错过了一些东西,我会更新我的问题,我会尝试让你知道,同时还有其他解决方法谢谢现在的工作,我以前尝试过这一点,但我使用select after=
符号,并给了我多个返回列的错误,所以我没有进一步尝试,为什么按这么多列分组,按ast分组。code\u name
给出相同的结果创建原始查询,并使用分组依据中的所有字段运行它。你会看到你得到的是5条记录,而不是3条。group by对您隐藏记录,因为您没有按所有唯一列进行分组。mySQL更高版本在默认情况下禁用了此功能。这是一个很好的特性,但在您完全理解聚合和分组之前,它通常会导致混乱。当返回的字段中的所有其他值相同时,只应按较少的字段分组。你的问题并非如此;因此,您的问题的一部分因为我使用hibernate,我对sql查询知之甚少,所以很难理解查询感谢您宝贵的时间,@xQbert的解决方案为meThis提供了返回IDs1,4,5的服务。测试:根据需要更改您的表格,并进行跟进。
分组中的成员需要为f.