【问题标题】:In mySQL, how do I return a list of grouped items limited to a certain number of groups + unique items在mySQL中,如何返回限制为一定数量的组+唯一项目的分组项目列表
【发布时间】:2010-03-23 14:14:21
【问题描述】:

好的,所以这个可能很难,但我会尽力解释。忍受我...

我有一个包含多个列的表,如下所示。

ITEM_ID - GROUP_ID
1 - 空
2 - 空
3 - 空
4 - 3
5 - 3
6 - 3
7 - 21
8 - 6
9 - 21
10 - 21
11 - 21
12 - 4
13 - 4
15 - 6
16 - 6
17 - 6
19 - 3

我想进入这个表并返回一个列表:

1.) 每个项目都是独立的。
2.) 每个项目都按组 ID 分组。
3.) 结果限制为总共 5 个组,每个为 null 的项目计为一个唯一组。
4.) 当返回一个组时,返回所有具有相同组号的对象。

我想通过这个例子返回:

1 - 空
2 - 空
3 - 空
4 - 3
5 - 3
6 - 3
19 - 3
7 - 21
9 - 21
10 - 21
11 - 21

因此项目 1,2 和 3 分别算作 1 个返回组,总共 3 个返回组。 第 4、5、6 和 19 项都是第 3 组,并算作一个返回组,使我们总共返回 4 组。项目 7、9、10 和 11 都是第 21 组,计为一个返回组,使我们的返回组总数达到 5 个,此时不再返回组或单个项目(计为组)。

我通常很擅长使用 SQL,但我完全不知道这一点。

谢谢大家!!!

【问题讨论】:

  • 好的,所以我会继续努力,可能会有一些有用的东西。以下代码将在按我想要的方式排序时正确返回 row_counter 变量。设置@count := 0, @group := ''; SELECT ITEM_ID, GROUP_ID, @count := IF (@group not like GROUP_ID OR GROUP_ID like "" OR GROUP_ID is null, @count +1,@count) AS row_counter, @group := GROUP_ID as dummy FROM myTable ORDER BY GROUP_ID 这会正确获取组计数,但一旦变量 row_counter 达到 5,就无法停止。我尝试使用 'WHERE row_counter
  • 好的,很抱歉,不知道为什么格式不正确,似乎不想让我格式化...
  • 哦,如果可以避免的话,我不想使用临时表。该查询通常会返回数千个结果并经常运行。我想让它仅限于运行它需要运行的东西。再次感谢!
  • 您按什么顺序排列组以将它们限制为 5 个?从示例来看,它首先看起来像空值,然后升序 group_id。
  • 丹,谢谢你的提问。我确实是按 group_id 对它们进行排序,首先是空值。每个空值都会增加计数器。之前未计算过的每个 group_id 也会增加计数器。一旦该计数器达到 5,我希望查询停止。我知道我可以使用嵌套选择,但内部表可能会很大,从而使我的查询非常缓慢。

标签: sql mysql


【解决方案1】:

这将返回您要求的内容。内部子查询只是过滤空值并分配一个唯一的“键”(一个负的 id 号)。这些“仅限于”前五个唯一组 ID,然后与子查询的副本连接以返回我们需要的记录。然后使用外部子查询以请求的方式打印结果集。

select a.item_id, case when a.group_id <= 0 then null else a.group_id end group_id 
from (
    select distinct group_id, item_id from test.so_test where group_id is not null 
    union
    (select  -item_id, item_id from test.so_test where group_id is null)
)  a inner join (
    select distinct group_id from test.so_test where group_id is not null 
    union
    (select  -item_id from test.so_test where group_id is null)
    order by group_id limit 0, 5
) b on a.group_id = b.group_id
order by case when a.group_id <= 0 then null else a.group_id end, a.item_id;

【讨论】:

  • 谢谢你,花了我一分钟时间看看你在做什么,但一旦我意识到我可能会踢自己:) 非常感谢你的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-27
  • 1970-01-01
  • 1970-01-01
  • 2020-08-23
  • 1970-01-01
相关资源
最近更新 更多