mysql从相邻行中选择最大字段值

mysql从相邻行中选择最大字段值,mysql,Mysql,第一次在这里问问题,所以请对我温柔一点: 我有两张桌子: 大师-不断成长的原木 当前-使用最新条目更新的单行 我试图从与第二个表单行中的名称匹配的master中选择连续块名行中的最大峰值行。此连续块必须是表中最新的连续块 因此,正确的结果是: 17 | 2016-03-12 23:57:00 | 190 | Tracey 大师: id | date time | peak | name -----------------------------------

第一次在这里问问题,所以请对我温柔一点:

我有两张桌子:

大师-不断成长的原木 当前-使用最新条目更新的单行 我试图从与第二个表单行中的名称匹配的master中选择连续块名行中的最大峰值行。此连续块必须是表中最新的连续块

因此,正确的结果是:

17   | 2016-03-12 23:57:00 | 190    | Tracey
大师:

id   | date time           | peak   | name
-------------------------------------------------
01   | 2016-03-12 23:41:00 | 201    | Tracey
02   | 2016-03-12 23:42:00 | 107    | Tracey
03   | 2016-03-12 23:43:00 | 103    | Tracey
04   | 2016-03-12 23:44:00 | 195    | Tracey
05   | 2016-03-12 23:45:00 | 134    | Tracey
06   | 2016-03-12 23:46:00 | 144    | Ian
07   | 2016-03-12 23:47:00 | 155    | Ian
08   | 2016-03-12 23:48:00 | 166    | Ian
09   | 2016-03-12 23:49:00 | 132    | Ian
10   | 2016-03-12 23:50:00 | 112    | Ian
11   | 2016-03-12 23:51:00 | 143    | Steve
12   | 2016-03-12 23:52:00 | 165    | Steve
13   | 2016-03-12 23:53:00 | 122    | Steve
14   | 2016-03-12 23:54:00 | 123    | Steve
15   | 2016-03-12 23:55:00 | 132    | Steve
16   | 2016-03-12 23:56:00 | 143    | Steve
17   | 2016-03-12 23:57:00 | 190    | Tracey ----
18   | 2016-03-12 23:58:00 | 165    | Tracey    |   
19   | 2016-03-12 23:59:00 | 154    | Tracey    | latest 
20   | 2016-03-13 00:00:00 | 131    | Tracey    | contiguous
21   | 2016-03-13 00:01:00 | 167    | Tracey    | block
22   | 2016-03-13 00:02:00 | 178    | Tracey ----
当前:

id   | date time           | peak   | name
---------------------------------------------
01   | 2016-03-13 00:02:00 | 178    | Tracey
@EhsanT的更新

我试过:

SET @name = 'Tracey';
SELECT * FROM `Master`
WHERE `name` = @name
AND `id` > (
    SELECT max(`id`)
    FROM `Master`
    WHERE `name` != @name
    AND `id` < (
        SELECT max(`id`)
        FROM `Master`
        WHERE `name` = @name
    )
)
ORDER BY peak DESC
LIMIT 1

此答案的最佳实践是使用程序

由于我不是编写过程的专家,您可以使用下面的代码,但是在运行此代码之前,您应该进行一些验证,比如检查传递给代码的名称是否存在于主表中,或者在表中此名称之前是否有其他名称,只有此名称在主表中

假设主表中有大量记录,且上述两个条件正确,则此代码将为您完成此工作:

select max(`peak`)
from `Master`
where `name` = 'Tracey'
and `id` > (
  select max(`id`)
  from `Master`
  where `name` != 'Tracey'
  and `id` < (
    select max(`id`)
    from `Master`
    where `name` = 'Tracey'
  )
)

再看一遍,如果使用Master中的最新id,则此查询实际上不需要第二个表。您是否需要一个查询来实现您的目标?一个查询将非常理想:如果您可以使用多个查询获得我要的结果,这也很好:对于最新的连续块,您可能还必须添加一些关于id大于最大id且名称不是当前名称的位置的信息。不确定如何编码…此代码将返回峰值为201而不是190的记录我非常确定这将需要一个循环,然后通过检查名称是否相同的ids向后退。我只是不知道如何对它进行编码这很好,但是当我尝试使用变量而不是声明的字符串时,如果我在变量中设置了名称,那么在上面的示例中如何使用它呢?再次感谢您的回答:您能否更新您的帖子,并使用您正在使用的参数/变量添加准确的查询,但该查询失败?我发现的问题是由于名称字段中的波浪号造成的
select max(`peak`)
from `Master`
where `name` = 'Tracey'
and `id` > (
  select max(`id`)
  from `Master`
  where `name` != 'Tracey'
  and `id` < (
    select max(`id`)
    from `Master`
    where `name` = 'Tracey'
  )
)
select *
from `Master`
where `name` = 'Tracey'
and `id` > (
  select max(`id`)
  from `Master`
  where `name` != 'Tracey'
  and `id` < (
    select max(`id`)
    from `Master`
    where `name` = 'Tracey'
  )
)
order by peak desc
limit 1