3

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

可以说我有 500 个 gmail 地址。

和 2 个 example.com 地址。

.. 等等..

我只想抓取具有相同域的每个地址中的 2 个。

有了这个字符串,我可以选择每个域上的域数,所以也许我可以用这个字符串做点什么。

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

请帮忙!

4

2 回答 2

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)
)
于 2013-03-03T16:41:40.443 回答
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)
于 2013-03-03T16:36:26.067 回答