MYSQL 如何从表中选择所有电子邮件但限制具有相同域的电子邮件数量

标签 mysql sql database greatest-n-per-group

正如主题所暗示的,我想选择列表中的所有电子邮件。但限制具有相同域的电子邮件数量。

假设我有 500 个 Gmail 地址。

还有 2 个 example.com 地址。

..等等..

I want to just grab 2 of each adress with the same domain.

有了这个字符串,我可以选择每个域上的域数量,所以也许我可以用这个字符串做一些事情。

SELECT substring_index(email, '@', -1), COUNT(*) FROM emaillist GROUP
BY substring_index(email, '@', -1);

请帮忙!

最佳答案

SELECT ID, Email, SUBSTRING_INDEX(EMAIL, '@', -1) Domain
FROM   emaillist a
WHERE  
(
    SELECT  COUNT(*)
    FROM    emaillist e
    WHERE   SUBSTRING_INDEX(e.EMAIL, '@', -1) = SUBSTRING_INDEX(a.EMAIL, '@', -1) AND
            a.ID <= e.ID
) <= 2;

上面的查询没有使用INDEX。这样做的结果是,如果您有一个非常大的数据库,它将执行 FULL TABLE SCAN 导致查询变慢。

我建议您创建一个额外的列,您必须为其定义一个 INDEX,例如,

CREATE TABLE emaillist 
(
    ID INT AUTO_INCREMENT PRIMARY KEY,
    EMAIL VARCHAR(50) NOT NULL,
    DOMAIN VARCHAR(15) NOT NULL,
    KEY (DOMAIN)
)

关于MYSQL 如何从表中选择所有电子邮件但限制具有相同域的电子邮件数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15187839/

相关文章:

php - Laravel 中每年都有单独的表

python - 升级了 python 并且无法让 mysqldb 工作

java - 重用 PreparedStatement 时可能会发生资源泄漏?

sql - 需要一个 sql 查询来按评论数/计数 DESC 查找评论最多的帖子

sql - 在字段等于另一个值的地方插入新行

MySQL整数作为where子句中的日期

MySQL:加入两个表值 - 一个表存储用户键值,另一个存储默认值

mysql - SQL 连接两个表,但如果第一个表存在于第二个表中,则覆盖第一个表

sql - 电子商务应用程序的最终国家列表

sql - PostgreSQL 特定值的当前计数