mysql – LIMIT结果为n个唯一列值?

我有一些像这样的MySQL结果:

---------------------------
| name | something_random |
---------------------------
| john | ekjalsdjalfjkldd |
| alex | akjsldfjaekallee |
| alex | jkjlkjslakjfjflj |
| alex | kajslejajejjaddd |
|  bob | ekakdie33kkd93ld |
|  bob | 33kd993kakakl3ll |
| paul | 3k309dki595k3lkd |
| paul | 3k399kkfkg93lk3l |
etc...

这持续了1000行的结果.我需要将结果数量限制为前50个唯一名称.我认为有一个简单的解决方案,但我不确定.

我已经尝试使用派生表和变量,但不能完全达到目的.如果每次名称不同时我能弄清楚如何增加一个变量,我想我可以说WHERE变量< = 50. 更新 我已经尝试了下面建议的内部连接方法.问题是这样的: 子选择SELECT DISTINCT name FROM testTable LIMIT 50获取前50个不同的名称.也许我在原帖中不够清楚,但这限制了我的查询太多了.在我的查询中,并非结果中返回表中的每个名称.让我修改我原来的例子:

----------------------------------
|   id | name | something_random |
----------------------------------
|    1 | john | ekjalsdjalfjkldd |
|    4 | alex | akjsldfjaekallee |
|    4 | alex | jkjlkjslakjfjflj |
|    4 | alex | kajslejajejjaddd |
|    6 |  bob | ekakdie33kkd93ld |
|    6 |  bob | 33kd993kakakl3ll |
|   12 | paul | 3k309dki595k3lkd |
|   12 | paul | 3k399kkfkg93lk3l |
etc...

所以我在这里添加了一些身份证号码.这些ID号码与表格中的人名相关.因此,您可以在结果中看到,并非表中的每个人/名都必须在结果中(由于某些WHERE条件).因此,列表中的第50个不同名称将始终具有高于49的ID号.第50个人可以是id 79,234,4954等…

所以回到问题所在.子选择SELECT DISTINCT name FROM testTable LIMIT 50选择表中的前50个名称.这意味着我的搜索结果将仅限于ID <= 50的名称,这个名称太紧缩了.如果某些名称未在查询显示(由于某些WHERE条件),则它们仍被视为50个不同名称之一.所以你得到的结果太少了. 更新2 致@trapper:这是我的查询的基本简化:

SELECT
    t1.id,t1.name,t2.details
FROM t1
LEFT JOIN t2 ON t1.id = t2.some_id
INNER JOIN
    (SELECT DISTINCT name FROM t1 ORDER BY id LIMIT 0,50) s ON s.name = t1.name
WHERE
    SOME CONDITIONS
ORDER BY
    t1.id,t1.name

我的结果看起来像这样:

----------------------------------
|   id | name |          details |
----------------------------------
|    1 | john | ekjalsdjalfjkldd |
|    3 | alex | akjsldfjaekallee |
|    3 | alex | jkjlkjslakjfjflj |
|    4 | alex | kajslejajejjaddd |
|    6 |  bob | ekakdie33kkd93ld |
|    6 |  bob | 33kd993kakakl3ll |
|   12 | paul | 3k309dki595k3lkd |
|   12 | paul | 3k399kkfkg93lk3l |
...
|   37 | bill | kajslejajejjaddd |
|   37 | bill | ekakdie33kkd93ld |
|   41 | matt | 33kd993kakakl3ll |
|   50 | jake | 3k309dki595k3lkd |
|   50 | jake | 3k399kkfkg93lk3l |
----------------------------------

结果在id = 50处停止.列表中没有50个不同的名称.只有大约23个不同的名字.

最佳答案
我的MysqL语法可能生锈,但想法是使用查询来选择前50个不同的名称,然后在名称上进行自联接并从联接中选择名称和其他信息.

select a.name,b.something_random
from Table b
    inner join (select distinct name from Table order by RAND() limit 0,50) a
         on a.name = b.name

相关文章

昨天的考试过程中,有个考点的服务器蓝屏重启后发现Mysql启动不了(5.6.45 x32版本,使用innoDB),重装后...
整数类型 标准 SQL 中支持 INTEGER 和 SMALLINT 这两种类型,MySQL 数据库除了支持这两种类型以外,还扩...
一条 SQL 查询语句结构如下: SELECT DISTINCT &lt;select_list&gt; FROM &lt;left_table&...
数据备份 1. 备份数据库 使用 mysqldump 命令可以将数据库中的数据备份成一个文本文件,表的结构和数据...
概述 在实际工作中,在关系数据库(MySQL、PostgreSQL)的单表数据量上亿后,往往会出现查询和分析变慢...
概述 触发器是 MySQL 的数据库对象之一,不需要程序调用或手工启动,而是由事件来触发、激活,从而实现...