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

时间:2013-03-03 16:31:41

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

当主题sugests我想要选择列表中的所有电子邮件。但是限制具有相同域的电子邮件数量。

假设我有500封gmail地址。

并且有2个example.com的地址。

..等等..

  

我想用同一个域抓取每个地址中的2个。

使用此字符串,我可以选择每个域上苛刻的域数,因此我可以使用此字符串执行某些操作。

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

请帮忙!

2 个答案:

答案 0 :(得分:2)

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)
)

答案 1 :(得分:1)

SELECT
  MIN(email) AS address1
  IF(MAX(email)==MIN(email),NULL,MAX(email)) AS address2
FROM emaillist
GROUP BY substring_index(email, '@', -1);

如果你想在一栏中

SELECT MIN(email) AS address1
FROM emaillist
GROUP BY substring_index(email, '@', -1)
UNION
SELECT MAX(email) AS address1
FROM emaillist
GROUP BY substring_index(email, '@', -1)