在MySQL中基于重复列删除行

时间:2019-01-14 12:54:03

标签: mysql sql

我遇到了一些类似的问题,但是我还是不太明白。

我有一个带有表的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中是否有一个简单的解决方案?

2 个答案:

答案 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;

这应该做。