mysql - SELECT 查询,其中 LIMIT 是重复键的不同计数

标签 mysql sql

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

--------------------
| 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 个位置以获得此结果:

示例转储代码:

SELECT * in Table
WHERE `name` LIKE '%al%' 
LIMIT BY DISTINCT
 `name`, 3

------ RESULT ------
| 1  | alfa |  a  |
| 2  | alfa |  b  |
| 3  | alfa |  c  |
| 4  | beal |  a  |
| 5  | beal |  b  |
| 6  | gala |  c  |
| 7  | gala |  d  |
--------------------

我很乐意提供帮助。

最佳答案

没有窗口函数:

select *
from (
  select distinct name
  from mytable
  where `name` like '%al%' 
  order by name
  limit 3
) n
natural join mytable

db-fiddle

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

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() :

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

db-fiddle

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

关于mysql - SELECT 查询,其中 LIMIT 是重复键的不同计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57006591/

相关文章:

sql - 在这种情况下如何使用 T-SQL MERGE?

sql - 使用 SQL 有效地反转外键

mysql - 具有 MAX 日期字段的 GROUP BY - 结果不稳定

sql - ScalaQuery 多对多

mysql - 在一组字符串上添加一些字符串

mysql - Azure中的Joomla-添加VirtueMart,错误502

mysql - 多态关联替代

sql - 一个版本的查询中出现 MySQL 错误 1111,另一版本中出现错误 1054

php - PDO::beginTransaction() 是否导致表或行锁定直到 PDO::commit()?

MYsql - 获取多行的开始时间和停止时间之间的平均时间