Mysql 多个表,同一列,使用where

Mysql 多个表,同一列,使用where,mysql,Mysql,我对这个查询有问题。它返回正确的total_名称、total_事件和total_misc,但其他三个总计(待定名称、事件和misc)是相同的数字,并且完全是错误的数字。这三个表都有一个created_by列。我做错了什么 SELECT COUNT(DISTINCT names_revisions.id) AS total_names, COUNT(DISTINCT events_revisions.id) AS total_events, COUNT(DISTINCT m

我对这个查询有问题。它返回正确的total_名称、total_事件和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)
IN()
子句的工作方式与您尝试使用它的方式不同。您需要在三个表之间加入
条件,然后在
中加入三个
=:user\u 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
IN()
子句的工作方式与您尝试使用它的方式不同。您需要在三个表之间加入
条件,然后在
中加入三个
=:user\u 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

您将合并表,而不是单独选择计数。对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

您将合并表,而不是单独选择计数。对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

我更喜欢这个方法,因为它看起来更干净。