繁体   English   中英

如何选择字段具有特定值的所有记录,直到显示具有不同值的记录?

[英]How to select all records where a field is of a certain value until a record shows up that has a different value?

假设我们有一个包含COLUMN1和COLUMN 2的表。这是记录的示例:

COLUMN 1 | COLUMN 2
124 | 12
124 | 11
124 | 10
124 | 9
26  | 8
65  | 7
65  | 6
65  | 5
65  | 4
23  | 3
124 | 2
124 | 1
124 | 0

绝对没有任何模式,但是我想做的是:

COUNT(*) | COLUMN 1 | Smallest Column 2
4 | 124 | 9
1 | 26  | 8
4 | 65  | 4
1 | 23  | 3
3 | 124 | 0

到目前为止,我一直在使用PHP进行此操作,但是我想找到一种在MySQL中执行此操作的方法,因为我敢肯定它会更加高效。 问题是,我什至不知道从哪里开始。 常规的GROUP BY COLUMN 1无效,因为我想要124的两个结果,因为它出现在两个不同的实例中。 我已经花了好几个小时不停地研究文档和Google,但我还找不到任何东西,我想知道你们中的任何一个是否能够为我指明正确的方向。 MySQL甚至有可能吗?

好吧,这花了点时间,但是在这里!

假设您在表中有一个id列,您可以通过该id列进行排序以获得一致的排序(如果您没有id列,按时间戳排序或内部查询中的任何内容)。

set @prev := '', @low := 0, @cnt := 0, @grp :=0;
select cnt, column1, low
from (
    select
        column2, 
        @low := if(@prev = column1, least(column2, @low), column2) low,
        @cnt := if(@prev = column1, @cnt + 1, 1) cnt,
        @grp := if(@prev = column1, @grp, @grp + 1) grp,
        @prev := column1 column1
    from (select column1, column2 from so9091342 order by id) x
    order by grp, cnt desc) y
group by grp;

这是建立测试表所需的sql:

create table so9091342 (id int primary key auto_increment, column1 int, column2 int);
insert into so9091342 (column1, column2) values (124,12),(124,11),(124,10),(124,9),(26,8),(65,7),(65,6),(65,5),(65,4),(23,3),(124,2),(124,1),(124,0);

以上查询的输出:

+------+---------+------+
| cnt  | column1 | low  |
+------+---------+------+
|    4 |     124 |    9 |
|    1 |      26 |    8 |
|    4 |      65 |    4 |
|    1 |      23 |    3 |
|    3 |     124 |    0 |
+------+---------+------+

ps我将表命名为so9091342,因为这是问题ID#9091342。

有趣的问题。 我知道Oracle比MySQL好得多,因此我能够使其在Oracle中工作。 可能是更好的方法,但这就是我想出的。

select count(col1) as cnt, col1, min(col2) as smallestCol2
from (
  select col1, col2, col2-rnk as rnk
  from 
  (
    select col1, col2, RANK() OVER (PARTITION by col1 order by col2 asc) as rnk
    from tmp_tbl
  )
)
group by col1,rnk
order by min(col2) desc

我不太确定MySQL中的等级和分区如何工作,但这可能会有所帮助:

MySQL中的排名函数

编辑 :澄清在我的查询中发生了什么:

内部查询为列1中的每个值分配一个唯一计数器(RNK)。最内部查询的结果是:

COL1 COL2   RNK
23   3      1
26   8      1
65   4      1
65   5      2
65   6      3
65   7      4
124  0      1
124  1      2
124  2      3
124  9      4
124  10     5
124  11     6
124  12     7

通过从第2列中减去等级,您可以为第1列值的每个分组获得唯一值。 第二个嵌套查询的结果是:

COL1 COL2  RNK
23   3     2
26   8     7
65   4     3
65   5     3
65   6     3
65   7     3
124  0     -1
124  1     -1
124  2     -1
124  9     5
124  10    5
124  11    5
124  12    5

然后,您可以将第1列和该唯一值分组。 最终结果:

CNT COL1 SMALLESTCOL2
4   124  9
1   26   8
4   65   4
1   23   3
3   124  0

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM