我有一些像这样的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号码与表格中的人名相关。因此,您可以在结果中看到,并非表中的每个人/名都必须在结果中(由于某些WHERE条件)。因此,列表中第50个不同的名称将始终具有高于49的ID号。第50个人可以是id 79,234,4954等...
回到问题所在。子选择SELECT DISTINCT name FROM testTable LIMIT 50
选择表格中的前50个名称。这意味着我的搜索结果将仅限于ID <= 50的名称,这个名称太紧缩了。如果某些名称未在查询中显示(由于某些WHERE条件),则它们仍被视为50个不同名称之一。所以你的结果太少了。
更新2
To @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个不同的名字。
答案 0 :(得分:6)
我的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
答案 1 :(得分:3)
SELECT DISTINCT name FROM table LIMIT 0,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 ORDER BY a.name
(SELECT DISTINCT name FROM
表ORDER BY RAND() LIMIT 0,50)
部分的工作原理是提取要包含在连接中的名称。所以我在这里随机抽取50个独特的名字,但如果你愿意,你可以将其更改为任何其他选择标准。
然后将这些结果重新加入到您的表格中。这会将这50个选定名称中的每一个链接回所有行,并为您的最终结果指定匹配的名称。最后ORDER BY a.name
只是为了确保每个名称的所有行最终组合在一起。
答案 2 :(得分:1)
这应该这样做:
SELECT tA.*
FROM
testTable tA
INNER JOIN
(SELECT distinct name FROM testTable LIMIT 50) tB ON tA.name = tB.name
;