首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >选择“查询”,其中限制是重复键的不同计数。

选择“查询”,其中限制是重复键的不同计数。
EN

Stack Overflow用户
提问于 2019-07-12 12:00:59
回答 2查看 498关注 0票数 2

我在选择特定数量的数据时遇到了问题。问题是其中一个键具有相同的重复值。

代码语言:javascript
复制
--------------------
| id | name | key |
--------------------
| 1  | alfa |  a  |
| 2  | alfa |  b  |
| 3  | alfa |  c  |
| 4  | beal |  a  |
| 5  | beal |  b  |
| 6  | gala |  c  |
| 7  | gala |  d  |
| 8  | delt |  a  |
| 9  | ceta |  a  |
--------------------

在这种情况下,我想选择三个单独的名字。例如,我希望将不同的名称限制为3个位置,以获得以下结果:

示例转储代码:

代码语言:javascript
复制
SELECT * in Table
WHERE `name` LIKE '%al%' 
LIMIT BY DISTINCT
 `name`, 3
代码语言:javascript
复制
------ RESULT ------
| 1  | alfa |  a  |
| 2  | alfa |  b  |
| 3  | alfa |  c  |
| 4  | beal |  a  |
| 5  | beal |  b  |
| 6  | gala |  c  |
| 7  | gala |  d  |
--------------------

我会很乐意帮忙的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-07-12 12:58:45

没有窗口功能:

代码语言:javascript
复制
select *
from (
  select distinct name
  from mytable
  where `name` like '%al%' 
  order by name
  limit 3
) n
natural join mytable

大小提琴

如果你不喜欢自然连接,你也可以使用

代码语言:javascript
复制
select t.*
from (
  select distinct name
  from mytable
  where `name` like '%al%' 
  order by name
  limit 3
) n
join mytable t on t.name = n.name

如果支持窗口函数,则可以使用DENSE_RANK()

代码语言:javascript
复制
with cte as (
  select *,
  dense_rank() over (order by name) as dr
  from mytable
  where `name` like '%al%'
)
  select id, name, `key`
  from cte
  where dr <= 3

大小提琴

我更喜欢LIMIT 3子查询,因为它可以在找到三个不同的名称之后停止索引扫描(取决于优化器)。

票数 2
EN

Stack Overflow用户

发布于 2019-07-12 12:49:17

MySQL 8.0使用窗口函数的解决方案如下:

代码语言:javascript
复制
SELECT 
  dt.id, dt.name, dt.`key` 
FROM 
(
  SELECT 
    ROW_NUMBER() OVER (PARTITION BY name ORDER BY id) AS rn, 
    id, 
    name, 
    `key`
  FROM your_table_name 
  WHERE name LIKE '%al%'
) AS dt 
WHERE dt.rn <= 3 
ORDER BY dt.id 

解释:

  1. 导出表 (子查询)中,确定特定名称的分区(组)中的Row_Number(),该分区(组)由id按升序排序。我们将只考虑与%al%条件匹配的名称。
  2. 现在,将子查询结果用于SELECT,只对行号最多为3的行使用子查询结果(基本上限制每个名称3行)。
  3. 顺便说一下,keyMySQL中的保留关键字。您应该考虑将列重命名为其他内容;否则,需要在其周围使用backticks。

结果

代码语言:javascript
复制
| id  | name | key |
| --- | ---- | --- |
| 1   | alfa | a   |
| 2   | alfa | b   |
| 3   | alfa | c   |
| 4   | beal | a   |
| 5   | beal | b   |
| 6   | gala | c   |
| 7   | gala | d   |

关于DB Fiddle的看法

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57006591

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档