2013-10-22 40 views
1

我試圖獲得一些統計信息;來自3個不同表格的總鏈接,用戶和視圖。 什麼我嘗試:MYSQL在不同的表上,在同一查詢中求和

SELECT SUM(p.views), COUNT(c.id), COUNT(u.id) 
FROM studenkel_userprefs as p, studenkel_content as c, studenkel_users as u 

如果我在三個不同的查詢分別做他們,他們的工作很好,但togheter結果得到一對夫婦比我想的要高千倍。我猜他們以某種方式相互交融,提示?

謝謝

編輯:謝謝你們,非常感謝你的幫助,整理出來。

+2

當你列出這樣'表FROM studenkel_userprefs爲p,studenkel_content爲c,studenkel_users爲u'它將爲您提供三個表中所有行的笛卡爾積,它也被稱爲'CROSS JOIN',您應該使用'INNER JOIN',但您需要指定三個表之間的相互關係,請更新您的問題並顯示他們是如何相關的。 –

+0

該查詢將導致笛卡爾連接,您需要將表連接在一起。 – Andrew

+0

使用適當的'JOIN'語法,並告訴DB ** HOW **這些表格彼此相關,例如,在這種情況下,你需要一個where子句:'... WHERE studenkel_userprefs.foo = studenkel_content.bar AND etc ...'。 –

回答

2

你在做什麼被稱爲隱式內部連接沒有標準。

這意味着您的最終視圖有p.rows * c.rows * u.rows行,這就是爲什麼你有奇怪的結果。

如果您有3個問題,請單獨提問,而不是一次全部提問。

或者,如果你真的想只有一個要求,你可以用一些醜陋去:

SELECT 
    SELECT SUM(views) FROM studenkel_userprefs as "sum_userprefs", 
    SELECT COUNT(id) FROM studenkel_content as "cnt_content", 
    SELECT COUNT(u.id) FROM studenkel_users as "cnt_users" 
FROM DUAL; 
0

你被允許「作弊」嗎?

SELECT 
    (
     SELECT 
      SUM(p.views) 
     FROM 
      studenkel_userprefs as p 
    ) as `views`, 
    (
     SELECT 
      COUNT(c.id) 
     FROM 
      studenkel_content as c 
    ) as `content_count`, 
    (
     SELECT 
      COUNT(u.id) 
     FROM 
      studenkel_users as u 
    ) as `user_count` 
0

這是因爲您正在進行表的笛卡爾連接,它將一個表中的行數乘以每個其他表中的行數。如果沒有指定JOIN ... ON格式的連接或通過在WHERE子句中指定連接條件,這是您將得到的唯一結果。

相關問題