我有一些像这样的 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/