获取最大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的行。这个解释得更好吗?

获取最大x行加上所有行信息每组在mysql到linq

在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) };