2012-07-21 25 views
0

我遇到了這個查詢的問題。它返回正確的total_names,total_events和total_misc,但其他三個總計(待定名稱,事件和misc)是相同的數字,並且完全是錯誤的數字。所有三個表都有created_by列。我究竟做錯了什麼?多個表,同一列,使用哪裏

SELECT 
    COUNT(DISTINCT names_revisions.id) AS total_names, 
    COUNT(DISTINCT events_revisions.id) AS total_events, 
    COUNT(DISTINCT misc_revisions.id) AS total_misc, 
    SUM(if(names_revisions.status = "Pending", 1, 0)) AS total_pending_names, 
    SUM(if(events_revisions.status = "Pending", 1, 0)) AS total_pending_events, 
    SUM(if(misc_revisions.status = "Pending", 1, 0)) AS total_pending_misc 
FROM 
    names_revisions, 
    events_revisions, 
    misc_revisions 
WHERE 
    :user_id IN (names_revisions.created_by, events_revisions.created_by, misc_revisions.created_by) 

回答

1

您要加入的表,而不是隻單獨選擇計數。使用3個表格而不是連接單獨查詢會更快

SELECT 
    names.total as toal_names, 
    names.pending as total_pending_names, 
    misc.total as total_misc, 
    misc.pending as total_pending_misc, 
    events.total as total_events, 
    events.pending as total_pending_events 
FROM 
    (
     SELECT 
      COUNT(names_revisions.id) AS total, 
      SUM(if(names_revisions.status = "Pending", 1, 0)) AS pending 
     FROM names_revisions 
     WHERE names_revisions.created_by = :user_id 
    ) as names, 
    (
     SELECT 
      COUNT(misc_revisions.id) AS total, 
      SUM(if(misc_revisions.status = "Pending", 1, 0)) AS pending 
     FROM misc_revisions 
     WHERE misc_revisions.created_by = :user_id 
    ) as misc, 
    (
     SELECT 
      COUNT(events_revisions.id) AS total, 
      SUM(if(events_revisions.status = "Pending", 1, 0)) AS pending 
     FROM events_revisions 
     WHERE events_revisions.created_by = :user_id 
    ) as events 
+0

我更喜歡這種方法,因爲它看起來更乾淨。 – zen 2012-07-22 00:04:25

2

IN()子句將不會以您嘗試使用它的方式工作。你需要在你的WHERE你的三個表之間JOIN狀況,然後是三個<table> = :user_id

SELECT 
    COUNT(DISTINCT names_revisions.id) AS total_names, 
    COUNT(DISTINCT events_revisions.id) AS total_events, 
    COUNT(DISTINCT misc_revisions.id) AS total_misc, 
    SUM(if(names_revisions.status = "Pending", 1, 0)) AS total_pending_names, 
    SUM(if(events_revisions.status = "Pending", 1, 0)) AS total_pending_events, 
    SUM(if(misc_revisions.status = "Pending", 1, 0)) AS total_pending_misc 
FROM 
    names_revisions, 
    JOIN events_revisions ON names_revisions.created_by = events_revisions.created 
    JOIN misc_revisions ON names_revisions.created_by = misc_revisions.created 
WHERE 
    names_revisions.created_by = :user_id 
    OR events_revisions.created_by = :user_id 
    OR misc_revisions.created_by = :user_id 
+0

好酷謝謝。 – zen 2012-07-22 00:04:37

相關問題