2


1

3つのテーブルとCOUNT()を使用したMySQL JOINが機能しない

MySQLステートメントに問題があります。 ユーザーが作成したコメントの数とトピックの数をカウントするクエリが必要です。 私のテーブル構造は次のようなものです。

Table 'users'
-------------
user_id
user_name
...

Table 'topics'
--------------
topic_id
topic_user_id
...

Table 'topiccomments'
---------------------
topiccomment_id
topiccomment_user_id
...

これまでのところ、このクエリを作成できました。

SELECT
    u.user_id,
    u.user_name,
    COUNT(t.topic_user_id) as topic_count,
    COUNT(tc.topiccomment_user_id) as topiccomment_count
FROM
    users as u
    JOIN topiccomments as tc ON u.user_id = tc.topiccomment_user_id
    JOIN topics as t ON u.user_id = t.topic_user_id
WHERE
    u.user_id = t.topic_user_id AND
    u.user_id = tc.topiccomment_user_id
GROUP BY
    u.user_id

このクエリは実行されますが、「topic_count」および「topiccomment_count」の値は完全に間違っており、その理由はよくわかりません。

ここの誰かが私を助けてくれることを望んでいましたか?

5 Answer


5


への変更

COUNT(DISTINCT t.topic_id) as topic_count,
COUNT(DISTINCT tc.topiccomment_id) as topiccomment_count

これにより、ユーザーIDと一致する個別のトピックとトピックコメントの数がカウントされます。 以前は、特定のユーザーのトピックとトピックコメントのクロス積の行数をカウントしていました。

それがあなたの状況で機能する場合、これはより効率的であるため、トピックをカウントするためのクエリとtopic_comments用のクエリにリファクタリングします。


2


クイックショット:count(field)をcount(distinct field)に置き換えてみてください


2


まず、WHERE句全体を削除できます。 JOINで既に面倒を見ているので、必要ありません。

問題を解決するには、現在のCOUNTステートメントではなく、SELECT句でこれを使用します。

COUNT(DISTINCT t.topic_id) as topic_count,
COUNT(DISTINCT tc.topiccomment_id) as topiccomment_count

トピックの数、またはトピックのコメントを数えようとしています。 ユーザーの数ではありません(常に1でなければなりません)。


1


JOINはおそらく、「topiccomments」テーブルと「topics」テーブルのデカルト積を返します。これは、それらの関係に制限がないためです。

この問題に取り組む簡単な方法の1つは、相関サブクエリを使用することです。

SELECT  u.user_id,
        u.user_name,
        SELECT (COUNT(*) FROM topics t WHERE t.id = u.id),
        SELECT (COUNT(*) FROM topiccomments tc WHERE tc.id = u.id)
FROM    users u;

他の回答の一部が示唆するように、元のクエリで「COUNT(DISTINCT t.topic_id)」と「COUNT(DISTINCT tc.topiccomment_id)」を使用することもできます。 実際、パフォーマンスの点でより効率的であることが判明する場合があります。


0


トピックとコメントはカウントする必要があり、コメント/トピックのユーザーIDではありません。

SELECT
    u.user_id,
    u.user_name,
    COUNT(DISTINCT t.topic_id) as topic_count,
    COUNT(DISTINCT tc.topiccomment_id) as topiccomment_count
FROM
    users as u
    JOIN topiccomments as tc ON u.user_id = tc.topiccomment_user_id
    JOIN topics as t ON u.user_id = t.topic_user_id
GROUP BY
    u.user_id