2012-12-16 38 views
1

我已经做了一个声明,使用group by。现在,我需要知道每个记录的详细信息,但我需要在一个语句中执行此操作。如何打印每个项目产生的声明

例如:我做了下面的查询,查询有关与_1结束的文件和共享相同的number

SELECT号,COUNT(*)AS sum domains FROM表
WHERE文件LIKE“% _1' GROUP BY数量的具有sum domains> 1

所以,如果我有如下表:

domain  | file  | Number 
------------------------------------  
aaa.com  | aaa.com_1 | 111 
bbb.com  | bbb.com_1 | 222 
ccc.com  | ccc.com_2 | 111 
ddd.com  | ddd.com_1 | 222 
eee.com  | eee.com_1 | 333 
qqq.com  | qqq.com_1 | 333 

查询的结果是(即超过file共享number以及与_1结束,并分享了这个号码file(S的计数)):

number | sum domains 
------------------------ 
222 | 2 
333 | 2 

我需要做的是打印出文件名称。我需要:

number | file 
------------------------ 
222 | bbb.com_1 
222 | ddd.com_1 
333 | eee.com_1 
333 | qqq.com_1 

我怎么能做到这一点,因为group by条款不允许我打印file(S)?

+0

寻找GROUP_CONCAT() – Rufinus

+0

我在每个组中都有很多记录。这根本不起作用。 – user1810868

回答

1

您可以JOIN查询背靠主表为子查询,以获得原始行和文件名:

SELECT 
    main.number, 
    main.file 
FROM 
    table AS main 
    /* Joined against your query as a derived table */ 
    INNER JOIN (
    SELECT number, COUNT(*) AS sum domains 
    FROM table 
    WHERE RIGHT(file, 2) = '_1' 
    GROUP BY number 
    HAVING sum domains > 1 
    /* Matching `number` against the main table, and limiting to rows with _1 */ 
) as subq ON main.number = subq.number AND RIGHT(main.file, 2) = '_1' 

http://sqlfiddle.com/#!2/cb05b/6

请注意,我已经取代你的LIKE '%_1'RIGHT(file, 2) = '_1'。很难说没有基准的话哪个更快。

+1

我打算说,如果OP使用'LIKE',他们需要转义下划线,因为它是一个通配符。 ('LIKE'%\ _ 1'') – Kermit

+0

@njk哦,你确实是对的。 –