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