2012-03-17 9 views
0

私は 'publisher'と 'magazine'という2つのテーブルからデータを取得しようとしています。私は出版社を掲載しており、「雑誌」の欄には雑誌の行数を表示したいと考えています。結果を複製するMySQL UNION

(
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構文で間違っているのか分からない、何とかこれを解決するのを助けてくれる? ありがとうございます。

答えて

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 
+0

これは私の問題を解決しました。実際、LEFT OUTER JOINはそれを解決しましたが、私はそれが簡単なことを認識しませんでした。ありがとうございました。 – Ikzer

関連する問題