2012-03-05 101 views
0

我想獲取特定成員的所有'krits',並獲取COUNT(id)具有kritID的行數來自其他兩個表格。試圖從2個不同的表中得到多個COUNT(id)基於前一個表的選擇

這是我迄今爲止,但它沒有得到準確的數字,它似乎已計數已添加到對方。在每個返回的kritID中。

是否有可能爲每個單獨的SQL查詢分別計數?

SELECT krit.id, krit.short_url, COUNT(referring_url) AS views , COUNT(click_date) AS clicks 

FROM ukritic_krits AS krit 
LEFT JOIN ukritic_krits_stats AS views ON views.kritID = krit.id 
LEFT JOIN ukritic_links_out AS clicks ON clicks.kritID = krit.id 

WHERE (krit.memberID = '[LOGGED IN MEMBER ID]') 

GROUP BY krit.id 

P.S.一些返回的計數的我是0,但我仍然需要價值生成的行返回

+0

ü可以張貼一些樣本數據和所需的O/p – Teja 2012-03-05 22:28:21

+0

SELECT krit.id,krit.short_url, COUNT(referring_url)AS視圖, COUNT(click_date)AS點擊 FROM ukritic_krits AS KRIT LEFT JOIN ukritic_krits_stats AS視圖 ON views.kritID = krit.id LEFT JOIN ukritic_links_out AS點擊 ON clicks.kritID = krit.id WHERE(krit.memberID ='「。$ _ SESSION ['loggedId']。」') GROUP BY krit.id – MadScientist 2012-03-05 22:37:36

+0

這是當前查詢,我得到所有結果但當有兩個計數都是相同的,例如。 陣列 ( [ID] => 96 [SHORT_URL] =>博斯 - 生活方式-V35-家庭娛樂系統 [觀點] => 376 [點擊] => 376 ) 但這一個因爲沒有點擊 陣列 ( [ID] => 108 [SHORT_URL] =>彼得利茲-便士股 [觀點] => 252 [點擊] => 0 ) – MadScientist 2012-03-05 22:39:20

回答

2

嘗試使用COUNT(DISTINCT)

SELECT 
    krit.id, krit.short_url, 
    COUNT(DISTINCT views.id) AS views, 
    COUNT(DISTINCT click.id) AS clicks 
FROM ukritic_krits AS krit 
LEFT JOIN ukritic_krits_stats AS views ON views.kritID = krit.id 
LEFT JOIN ukritic_krits_stats AS clicks ON clicks.kritID = krit.id 
WHERE (krit.memberID = '[LOGGED IN MEMBER ID]') 
GROUP BY krit.id 

我的猜測是,你所看到的問題是,總的計數將等於views的個數乘以clicks的個數,因爲每個匹配的view記錄然後是left joined到每個匹配的clicks記錄。通過做COUNT(DISTINCT),您只能計算每個唯一的ID而不是所有行。


編輯:

在你的問題查詢改變,所以,因爲我不得不反正編輯,它可能是更有效的在這種情況下,而不是LEFT JOINs使用子查詢,因爲你會避免不同的操作...但你當然應該測試:

SELECT 
    krit.id, 
    krit.short_url, 
    (SELECT COUNT(*) FROM ukritic_krits_stats WHERE kritID = krit.id) AS views, 
    (SELECT COUNT(*) FROM ukritic_links_out WHERE kritID = krit.id) AS clicks 
FROM ukritic_krits AS krit 
WHERE (krit.memberID = '[LOGGED IN MEMBER ID]') 
+0

我是行在問題中更新了與當前位置相關的sql查詢。 – MadScientist 2012-03-05 22:40:42

+0

你是一個像魅力一樣工作的人 - 非常感謝! – MadScientist 2012-03-05 22:43:37

0
SELECT krit.id, krit.short_url, 
     SUM(CASE WHEN views.id IS NOT NULL THEN 1 ELSE 0 END) AS views, 
     SUM(CASE WHEN click.id IS NOT NULL THEN 1 ELSE 0 END) AS clicks  
    FROM ukritic_krits AS krit 
     LEFT JOIN ukritic_krits_stats AS views 
      ON views.kritID = krit.id 
     LEFT JOIN ukritic_krits_stats AS clicks 
      ON clicks.kritID = krit.id  
    WHERE (krit.memberID = '[LOGGED IN MEMBER ID]')  
    GROUP BY krit.id 
+0

我更新了與當前位置相關的問題中的sql查詢。 – MadScientist 2012-03-05 22:41:06

相關問題