2

私は3つのテーブルを持っています

  • resources_connection
    1. resource_id
    2. resource_tag_id
  • resources_flags
    1. ユーザーID
    2. resource_id
  • resources_votes
    1. ユーザーID
    2. resource_id

それぞれが 2 列のテーブルで、単一の「リソース ID」に基づいてタグ、フラグ、および投票の数をクエリできるように設計された両方の int (11) です。

現在、このクエリを使用して、タグ ( resources_connection)、フラグ ( resources_flags)、および投票 ( resources_votes)の数を取得しようとしています。

SELECT COUNT(DISTINCT t1.resource_id) as votes,
        COUNT(DISTINCT t2.resource_id) as flags,
        COUNT(DISTINCT t3.resource_tag_id) as tags
FROM ecruit_demo.resources_votes t1
LEFT JOIN ecruit_demo.resources_flags t2
    ON (t1.resource_id = t2.resource_id)
JOIN ecruit_demo.resources_connection t3
    ON (t1.resource_id = t3.resource_id) WHERE t1.resource_id = 4

問題は、このクエリが適切な結果を返すことですが、 4resource_id = 1 (タグがある)に設定resource_idすると、すべてゼロが返されることです。このクエリが常に適切なタグ、フラグ、および投票の数を特定の.resource_id

データベースでresource_id = 4が発生する唯一の場所はresources_connectionであることも追加する必要があります。他の2つのテーブルにはこの値がありません

4

2 に答える 2

3
SELECT  resource_ID,
        MAX(CASE WHEN types = 'votes' THEN totals ELSE NULL END) votes,
        MAX(CASE WHEN types = 'flags' THEN totals ELSE NULL END) flags,
        MAX(CASE WHEN types = 'tags' THEN totals ELSE NULL END) tags
FROM    
    (
        SELECT  resource_ID, 'votes' types, 
                COUNT(DISTINCT resource_ID) totals
        FROM    resources_votes
        GROUP   BY resource_ID
        UNION
        SELECT  resource_ID, 'flags' types, 
                COUNT(DISTINCT resource_ID) totals
        FROM    resources_flags
        GROUP   BY resource_ID
        UNION
        SELECT  resource_ID, 'tags' types, 
                COUNT(DISTINCT resource_tag_id) totals
        FROM    resources_connection
        GROUP   BY resource_ID
    ) s
-- WHERE    resource_ID = 1
GROUP   BY resource_ID
于 2013-02-08T02:39:43.377 に答える
0

私はmysqlがあまり得意ではありませんが、試してみてください:

JOIN を LEFT JOIN に変更すると、クエリは次のようになります。

 SELECT COUNT(DISTINCT t1.resource_id) as votes,
            COUNT(DISTINCT t2.resource_id) as flags,
            COUNT(DISTINCT t3.resource_tag_id) as tags
    FROM ecruit_demo.resources_votes t1
    LEFT JOIN ecruit_demo.resources_flags t2
        ON (t1.resource_id = t2.resource_id)
    LEFT JOIN ecruit_demo.resources_connection t3
        ON (t1.resource_id = t3.resource_id) WHERE t1.resource_id = 4
于 2013-02-08T02:41:43.980 に答える