我遇到了一些类似的问题,但是我还是不太明白。
我有一个带有表的MySQL数据库,在其中存储人员和唯一代码的数据。对我来说,基本单位是电子邮件地址。我想选择随机记录,但要限制它们,以便特定的电子邮件列只能选择一次。这是我的表结构(我要保留一些与此问题无关的列)。
+-----+-------------------+---------+----------+----------+
| ID | email | name | lastname | code |
+-----+-------------------+---------+----------+----------+
| 1 | mail@gmail.com | Simon | Hardy | 123ABC |
| 2 | john@yahoo.com | John | Doe | EEEEEE |
| 3 | john@yahoo.com | John | Doe | AEAEAE |
| 4 | xyz@bing.com | Bill | Liebe | 5D78AC |
| 5 | ellen@gmail.com | Ellen | Petete | 99AQE5 |
| 6 | john@yahoo.com | John | Doe | 000CVV |
| 7 | peter@gmail.com | Peter | Lorem | 54ACSS |
| 8 | emma@gmail.com | Emma | Stone | 98WW7Q |
+-----+-------------------+---------+----------+----------+
如果我将选择限制为3行,并且以某种方式选择了电子邮件= john@yahoo.com的行,则我需要将此电子邮件的其他两行忽略/跳过。现在这是我的查询:
SELECT * FROM people ORDER BY RAND() LIMIT 3
PS:我知道“ ORDER BY RAND()”很慢,我只是还没有专注于这一部分。
我当时在考虑GROUP BY,但据我所知,我只会得到那一列,所以我需要提取所有这些列。
在MySQL中是否有一个简单的解决方案?
答案 0 :(得分:2)
在MySQL 8+中,您可以使用:
SELECT p.*
FROM people p
ORDER BY ROW_NUMBER() OVER (PARTITION BY email ORDER BY RAND())
LIMIT 3;
如果要同时解决性能问题和重复问题。 。 。很有挑战性。我的建议是选择较少的行数,而只是“希望”有足够多的不同电子邮件。
例如,对于3封电子邮件,您可能希望获得约100行,如下所示:
select p.*,
(@rn := if(@e = email, @rn + 1,
if(@e := email, 1, 1)
)
) as rn
from (select p.*
from people p cross join
(select count(*) as cnt from people) pp -- can use primary key index
where rand() < (100 / cnt) -- get about 100 rows
order by email, rand() -- only on about 100 rows
) p cross join
(select @e := '', @rn := 0) params
having rn = 1
limit 3;
答案 1 :(得分:0)
编辑**
选择* FROM测试 在哪里 (通过电子邮件从“测试组”中选择MIN(id))为3;
这应该做。