获取最大x行加上所有行信息每组在mysql到linq
本文关键字:mysql linq 信息 获取 | 更新日期: 2023-09-27 18:09:33
前一段时间,我发现了一个方便的mysql查询,以获得每个组的top X。这就是我的意思:
<>之前Rid id1 id2 id3值11,11,102 11 2 113 1 1 3 94 1 2 1 205 1 2 2 186 1 23 237 1 3 1 308 1 3 2 349 1 3 3 3110 1 3 4 2711 1 3 5 3212 1 41 4113 1 4 2 4014、14、4、3、4315 15 5 1 5316 1 5 2 5117 1 5 3 5018 2 11 1119 2 1 2 920 2 1 3 12之前我想要得到这个结果:
<>之前Rid id1 id2 id3值2 11 2 116 1 23 238 1 3 2 3414、14、4、3、4315 15 5 1 53之前我可以通过运行以下mysql查询得到:
SELECT * FROM
(SELECT * FROM idsandvalue
WHERE id1=1 AND
(SELECT COUNT(*) FROM idsandvalue AS helper
WHERE helper.id1 = idsandvalue.id1
AND helper.id2= idsandvalue.id2
AND helper.value > idsandvalue.value
) < 1
)a;
如果我改变<1到2 3或者x我可以得到id1=1时每个id2的顶部x(两个相同的id2和不同的id3)像这样:
rid id1 id2 id3 value
1 1 1 1 10
2 1 1 2 11
4 1 2 1 20
6 1 2 3 23
8 1 3 2 34
11 1 3 5 32
12 1 4 1 41
14 1 4 3 43
15 1 5 1 53
16 1 5 2 51
两个问题。A)在MySQL中查询不是真的快。需要一些时间(运行一个包含3207394行的表)。我可以得到相同的结果与使用不同的查询(我不能得到它)。B)我怎么把这个翻译成linq?由于奇怪的where语句,我不知道如何将其转换为linq.
(后来我也添加了这个额外的问题)在MySQL中,我使用这个查询:
SELECT *,COUNT(*) AS Counter FROM idsandvalue GROUP BY id1,id2;
得到这个结果:
<>之前rid id1 id2 id3 value计数器1 1 1 1 10 34 1 2 1 20 37 1 3 1 30 512 1 41 41 315 15 5 1 53 318 2 11 11 3之前我也有困难把这个翻译成Linq。
(额外信息太大,无法注释)
嗨,约翰(谢谢你的快速回应)。使用这个mysql查询
SELECT * FROM
(SELECT * FROM idsandvalue
WHERE id1=1 AND
(SELECT COUNT(*) FROM idsandvalue AS helper
WHERE helper.id1 = idsandvalue.id1
AND helper.id2= idsandvalue.id2
AND helper.value > idsandvalue.value
) < 1
)a
我尝试获得每个分组id1和id2的行与它的最大值。这就是为什么在这种情况下,我得到例如id为2的行。在id1=1 id2=1的情况下,11是10 11和9中最大的。这就是为什么我得到了id为8的行,因为当id1=1和id2=3时,列值的最大值是34。如果我将查询改为<2,我得到了前两个。对于id2=1和id2=3,这将给出id为8和11的行。这个解释得更好吗?
在SQL Server中重新创建表并对其运行查询,然后通过linqer转换查询:
from a in ((from idsandvalue in db.idsandvalue whereidsandvalue.id1 == 1 &&
(from helper in db.idsandvalue
where
helper.id1 == idsandvalue.id1 &&
helper.id2 == idsandvalue.id2 &&
helper.value > idsandvalue.value
select new {
helper
}).Count() < 1
select new {
idsandvalue
}))
select new {a.idsandvalue.rid,a.idsandvalue.id1,a.idsandvalue.id2,a.idsandvalue.id3,a.idsandvalue.value}
如何:
var takeRows = 2; // or whatever value you want
var q = from i in idsandvalue
group i by new { i.ID1, i.ID2 } into g
orderby g.Key.ID1, g.Key.ID2
select new { g.Key.ID1, g.Key.ID2, TopValues = g.OrderByDescending(i => i.Value).Take(takeRows) };