获取多行MYSQL的最后一个值

时间:2017-03-20 15:30:23

标签: mysql subquery

我有一个表用于记录应用程序的活动日志。现在我必须从实体X获取已在某些日期范围内发布的所有记录。因此,如果记录已发布且稍后未发布,则不必显示在结果中。

我不知道如何解释它,它找到每个的最后一次出现然后捕获“1”或“0”的值,取决于我在每种情况下都需要。

一个简化的例子(真实表有更多字段和更多数据):

id  user_id date         model main_relation_id field   new_value
1   24      2017-03-21   A     1               publish 1
2   24      2017-03-21   A     2               publish 1
3   24      2017-03-22   A     3               publish 0
4   24      2017-03-22   A     2               update  some text
5   24      2017-03-23   A     1               publish 0
6   24      2017-03-23   A     1               update  some text
7   24      2017-03-24   A     3               publish 1
8   24      2017-03-24   A     2               publish 0
9   24      2017-03-24   A     2               update  some text
10  24      2017-03-25   A     1               publish 1
11  24      2017-03-25   A     2               publish 1
11  24      2017-03-26   A     3               publish 0

我需要获取main_relation_id,按模型和日期进行过滤,所以如果我想获得模型A中已于2017-03-21和2017-03-24之间发布的所有寄存器,我将得到:

model_main_relation_id
1 
3

如果我想获得在相同日期未发布的所有寄存器,结果必须是:

model_main_relation_id
2

我怎样才能得到这个结果?

1 个答案:

答案 0 :(得分:0)

因此,您希望按main_relation_id过滤最新状态,特定main_relation_id是否已发布(field='publish'; new_value=1)或未发布(field='publish'; new_value=0)周期。

由于样本数据的date字段中的日期对于多个记录是相等的,因此我必须假设id字段中的较高值意味着以后的事件。因此max(id)main_relation_id会产生最新的记录。

我要做的是在max(id)main_relation_id的派生表中的特定模型的日期范围内获取field 'publish'并加入此项在您的表格中找出特定的main_relation_id是否已发布:

select table.main_relation_id
from table
inner join
    (select main_relation_id, max(id) as maxid
     from table
     where date>=... and date<=... and `field`='publish' and model='...'
     group by main_relation_id) t on table.id=t.maxid
where table.new_value=1

您需要替换过滤条件代替...。如果您想获取未发布的数据,请将table.new_value=1条件替换为table.new_value=0