MySQL UNION复制结果

时间:2012-03-17 15:23:24

标签: mysql

我正在尝试从两个表格''publisher'和'magazine'中检索数据。我正在列出出版商,并希望在“杂志”栏中显示杂志行的数量。我正在使用此代码:

(
SELECT 
    p.id as id,
    p.publisher as publisher, 
    p.flag as flag,
    p.visits as visits, 
    IF(p.magazines>0,COUNT(distinct m.id),0) AS magazines 
FROM publisher p, magazine m
WHERE m.publisher = p.id
GROUP BY p.publisher
)
UNION
(
SELECT
        p.id as id,
        p.publisher as publisher, 
        p.flag as flag, 
        p.visits as visits, 
        p.magazines as magazines
FROM publisher p
GROUP BY p.publisher
)
ORDER BY publisher

但我得到的结果是这样的:

ID  Pub     Magazines           Visits 
7   Pub7    1                   2
7    Pub7    15                  2
5   Pub5    0                   4
4   Pub4    0                   3
3   Pub3    2                   26
2   Pub2    2                   13
1   Pub1    9                   18
6   Pub6    1                   1

如您所见,最后一条记录显示两次,并以某种方式显示杂志的总和。我不知道SQL语法有什么问题,能以某种方式帮我解决这个问题吗? 提前谢谢。

1 个答案:

答案 0 :(得分:0)

您应该了解GROUP BY hidden columns。为避免出现问题,请将所有列出的SELECT子句字段复制到GROUP BY中,除聚合字段外都将其复制。

SELECT 
    p.id as id,
    p.publisher as publisher, 
    p.flag as flag,
    sum( p.visits ) as visits,
    COUNT(distinct m.id) AS magazines 
FROM 
   publisher p left outer join 
   magazine m
     on m.publisher = p.id
GROUP BY p.id, p.publisher, p.flag
ORDER BY publisher