![](/img/trans.png)
[英]MYSQL select 3 random records where at least one record-field has certain value
[英]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中的等级和分区如何工作,但这可能会有所帮助:
编辑 :澄清在我的查询中发生了什么:
内部查询为列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.