2011-12-15 23 views
0

だから私は数多くの本を数えたいが、同じ属性名の2つの異なる表に本が格納されている。 私がどのように見える結果を取得したい:私はこのトリプルが参加しようとしたsql三重結合:あいまいな属性名のカウント

name1 [total number of books of 1] 
    name2 [total number of books of 2]  

を。

SELECT DISTINCT name, count(book) 
FROM writes w 
LEFT JOIN person p on p.id = w.author 
LEFT JOIN book b on b.title = w.book 
LEFT JOIN controls l on l.controller=p.id 
GROUP BY name 
ORDER BY name DESC 

ただし、本は書き込みとコントロールに属性として存在するため、クエリは実行できません。 これは、ブックを識別できるように結合の1つを省いた場合にのみ行うことができます。

SQLエンジンに各ブック属性の数を1人ずつカウントさせるにはどうすればよいですか?

+0

名、書籍の数が、私はとにかく...タグの彼らのOPのすべての質問をチェックしていないためごめんなさい –

答えて

2

あなたに興味を持って、あなたは2つの異なるSQLを発行して、単一の出力を処理するためにそれらをマージする必要があり、データベース設計の結果として。あなたの目的のために

A)

SELECT DISTINCT w.name as 'Name', count(w.book) as 'Cnt' 
FROM writes w 
LEFT JOIN person p on p.id = w.author 
LEFT JOIN book b on b.title = w.book 

B)

SELECT DISTINCT l.name as 'Name', count(l.book) as 'Cnt' 
FROM controls l 
LEFT JOIN person p on p.id = l.controller 
LEFT JOIN book b on b.title = l.book 

、あなたはAとB

のUNIONを得ることができます。また、第三のデータソースとして使用することができますSQL

select A.Name, sum(A.Cnt+B.Cnt) 
from A, B 
where A.Name = B.Name 
group by A.Name 
order by A.Name 
1
WITH T AS 
( 
    SELECT DISTINCT 'WRITES' FROMTABLE, w.name, w.count(book) 
    FROM writes w 
    LEFT JOIN person p on p.id = w.author 
    LEFT JOIN book b on b.title = w.book 
    GROUP BY name 
    UNION ALL 
    SELECT DISTINCT 'CONTROLLS' FROMTABLE, c.name, count(c.book) 
    FROM controlls c 
    LEFT JOIN person p on p.id = c.author 
    LEFT JOIN book b on b.title = c.book 
    GROUP BY name 
) 
SELECT * FROM T ORDER BY NAME 

HTH

+0

です:http://stackoverflow.com/questions/1382573/how- mysqlを使ってdo-you-use-the-with-clause-in-mysql –

0

一人一人の著者IDと、書いた本の本数に基づいて作業します。事前集計では、著者ごとに1つのレコードが返されます。次に、人のテーブルに参加して名前を取得します。私が著者のIDと名前でそれを残している理由は、あなたが2人の作者 "John Smith"を持っていて、それぞれのIDが123と389の場合です。人(またはあなた)。問題イマイチ

select 
     P.ID, 
     P.Name, 
     PreAgg.BooksPerAuthor 
    from 
     (select 
       w.author, 
       count(*) BooksPerAuthor 
      from 
       writes w 
      group by 
       w.author) PreAgg 
     JOIN Person P 
     on PreAgg.Author = P.id 
    order by 
     P.Name 
関連する問題