Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何选择最后记录sql的第n行?_Mysql_Sql - Fatal编程技术网

Mysql 如何选择最后记录sql的第n行?

Mysql 如何选择最后记录sql的第n行?,mysql,sql,Mysql,Sql,我遇到了这样一种情况,我必须显示前9行的域名电子邮件和电子邮件的出现次数,第10行作为剩余域的总和,并显示为其他域 我所做的一切 我已经使用下面的查询成功地获取了不同的域及其出现的情况 SELECT (SUBSTRING_INDEX(SUBSTR(email, INSTR(email, '@') + 1),'.',1)) as domain, COUNT(*) as C FROM newsletter_recipient where LENGTH(email) > 0 GRO

我遇到了这样一种情况,我必须显示前9行的域名电子邮件和电子邮件的出现次数,第10行作为剩余域的总和,并显示为其他域

我所做的一切

我已经使用下面的查询成功地获取了不同的域及其出现的情况

SELECT (SUBSTRING_INDEX(SUBSTR(email, INSTR(email, '@') + 1),'.',1)) as domain,
       COUNT(*) as C
FROM newsletter_recipient
where LENGTH(email) > 0
GROUP BY (SUBSTRING_INDEX(SUBSTR(email, INSTR(email, '@') + 1),'.',1))
ORDER BY COUNT(*) DESC
当前结果

domain           C
------------------------    
gmail           12  
dddd            2   
mmmmm           2   
dsf             2   
aaaa            1   
bbbb            1   
ccc             1   
yopmail         1   
yahoo           1   
dde             1   
rfg             1   
eedd            1   
dfdg            1   
sad             1   
dfdf            1   
sfd             1   
web             1   
预期结果

domain           C
------------------------    
gmail           12  
dddd            2   
mmmmm           2   
dsf             2   
aaaa            1   
bbbb            1   
ccc             1   
yopmail         1   
yahoo           1
others          8
希望有人能帮忙

表达时使用一个case-


使用两个聚合级别:

SELECT (CASE WHEN seqnum < 10 THEN domain ELSE 'Others' END) as domain,
       SUM(c)
FROM (SELECT SUBSTRING_INDEX(SUBSTR(email, INSTR(email, '@') + 1), '.', 1) as domain,
             COUNT(*) as C,
             ROW_NUMBER() OVER (ORDER BY COUNT(*) DESC) as seqnum
      FROM newsletter_recipient
      WHERE LENGTH(email) > 0
      GROUP BY domain
     ) d
GROUP BY (CASE WHEN seqnum < 10 THEN domain ELSE 'Others' END)
ORDER BY SUM(c) DESC;

你可以试试下面的方法

WITH cte AS (
     SELECT (SUBSTRING_INDEX(SUBSTR(email, INSTR(email, '@') + 1),'.',1)) as domain,
     COUNT(*) as C
     FROM newsletter_recipient
     WHERE LENGTH(email) > 0
     GROUP BY (SUBSTRING_INDEX(SUBSTR(email, INSTR(email, '@') + 1),'.',1))
     ORDER BY COUNT(*) DESC
)
SELECT 
     IF(rn < 10, domain, 'others') AS domain_name,
     SUM(c) AS count
FROM (
     SELECT domain, c, ROW_NUMBER() OVER () AS rn FROM cte
) T
GROUP BY domain_name

我会先通过10+个工会来解决这个问题:

SELECT * from (

SELECT 
    (SUBSTRING_INDEX(SUBSTR(email, INSTR(email, '@') + 1),
            '.',
            1)) AS domain,
    COUNT(*) AS C
FROM
     newsletter_recipient
WHERE
    LENGTH(email) > 0
GROUP BY (SUBSTRING_INDEX(SUBSTR(email, INSTR(email, '@') + 1),
        '.',
        1))
ORDER BY COUNT(*) DESC
Limit 10) as FIRST_10

UNION 

SELECT 'others', sum(ALL_OTHERS.C) from (

SELECT 
    COUNT(*) AS C
FROM
    newsletter_recipient
WHERE
    LENGTH(email) > 0
GROUP BY (SUBSTRING_INDEX(SUBSTR(email, INSTR(email, '@') + 1),
        '.',
        1))
ORDER BY COUNT(*) DESC
Limit 11,18446744073709551615
) as ALL_OTHERS

18446744073709551615:足够大,可以跳过前10个并确保检索到所有其他邮件,请参阅:

ohh..我不能在not in中硬编码邮件客户端,因为它们是动态的:-
SELECT * from (

SELECT 
    (SUBSTRING_INDEX(SUBSTR(email, INSTR(email, '@') + 1),
            '.',
            1)) AS domain,
    COUNT(*) AS C
FROM
     newsletter_recipient
WHERE
    LENGTH(email) > 0
GROUP BY (SUBSTRING_INDEX(SUBSTR(email, INSTR(email, '@') + 1),
        '.',
        1))
ORDER BY COUNT(*) DESC
Limit 10) as FIRST_10

UNION 

SELECT 'others', sum(ALL_OTHERS.C) from (

SELECT 
    COUNT(*) AS C
FROM
    newsletter_recipient
WHERE
    LENGTH(email) > 0
GROUP BY (SUBSTRING_INDEX(SUBSTR(email, INSTR(email, '@') + 1),
        '.',
        1))
ORDER BY COUNT(*) DESC
Limit 11,18446744073709551615
) as ALL_OTHERS