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)
4

2 回答 2

2

IN()子句不会按照您尝试使用它的方式工作。您需要JOIN三个表之间的条件,然后是三个表<table> = :user_id中的条件WHERE

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
于 2012-07-21T23:55:46.280 回答
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
于 2012-07-22T00:00:43.413 回答