mysql - 将结果限制为 n 个唯一的列值?

标签 mysql

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

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

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

我试过使用派生表和变量,但不太成功。如果我能弄清楚每次名称不同时如何递增一个变量,我想我可以说 WHERE variable <= 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 号码。这些 ID 号与表中的人名有关。所以你可以在结果中看到,并不是表中的每个人/名字都必然在结果中(由于某些 WHERE 条件)。所以列表中第 50 个不同的名字将始终具有大于 49 的 ID 号。第 50 个人可以是 ID 79、234、4954 等...

回到问题。 subselect 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 - 将结果限制为 n 个唯一的列值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9525832/

相关文章:

mysql - SQL查询Prestashop : how to filter combinations?

mysql - 如何在 ruby​​ on rails 中获取 Object 的值

PHP 将 SQL 字段名称打印为数组,对应的值每行显示一次

mysql - 子查询返回超过 1 - 将值传递到子查询的问题

php - mysql php从2个表中选择具有相同字段名称的字段

mysql - Azure MySQL 服务器允许禁用 'sql_mode=only_full_group_by'

php - 在PHP mysql中将状态从未解决标记为已解决

php - 如果表中存在值则循环查询直到不存在

Mysql - 仅父类别的递归查询

php - 使用 PHP 删除日期