0

このクエリに問題があります。正しい total_names、total_events、および total_misc を返しますが、他の 3 つの合計 (保留中の名前、イベント、およびその他) は同じ数であり、完全に間違った数です。3 つのテーブルすべてに、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()句は、使用しようとしている方法では機能しません。JOIN3 つのテーブル間で条件が必要になり、次に 3 つの条件が必要<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 に答える