2011-12-15 31 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 

但由於book在寫入和控件中作爲屬性存在,因此無法執行查詢。 它只能做到這一點,如果我離開了一個聯接,所以它可以識別書。

如何告訴sql引擎爲每個人統計兩個書屬性的數量?

+0

名心不是問題,書本上的計數 – 2011-12-15 21:13:28

回答

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 

你的目的,你可以得到一個聯盟和B

,或者你可以在第三把它們作爲數據源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的 – 2011-12-15 21:23:45

0

這將根據每位不同作者的ID來確定他們寫了多少書。預先聚合將爲每位作者返回一個記錄以及該作者的多少本書。然後,加入到人員表中以獲得姓名。我通過作者的ID和姓名離開它的原因是......如果您有兩位作者「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