我在选择特定数量的数据时遇到了问题。问题是其中一个键具有相同的重复值。
--------------------
| 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 |
--------------------我会很乐意帮忙的。
发布于 2019-07-12 12:58:45
没有窗口功能:
select *
from (
select distinct name
from mytable
where `name` like '%al%'
order by name
limit 3
) n
natural join mytable如果你不喜欢自然连接,你也可以使用
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我更喜欢LIMIT 3子查询,因为它可以在找到三个不同的名称之后停止索引扫描(取决于优化器)。
发布于 2019-07-12 12:49:17
MySQL 8.0使用窗口函数的解决方案如下:
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 解释:
Row_Number(),该分区(组)由id按升序排序。我们将只考虑与%al%条件匹配的名称。SELECT,只对行号最多为3的行使用子查询结果(基本上限制每个名称3行)。key是MySQL中的保留关键字。您应该考虑将列重命名为其他内容;否则,需要在其周围使用backticks。结果
| id | name | key |
| --- | ---- | --- |
| 1 | alfa | a |
| 2 | alfa | b |
| 3 | alfa | c |
| 4 | beal | a |
| 5 | beal | b |
| 6 | gala | c |
| 7 | gala | d |https://stackoverflow.com/questions/57006591
复制相似问题