0

この MySQL 選択クエリで混乱しています。正しい情報が返されますが、返される情報COUNT(messages)COUNT(project_ideas)2 倍になります。

SELECT  
    create_project.title, 
    image1, 
    create_project.description, 
    create_project.date, 
    create_project.active, 
    create_project.completed, 
    create_project.project_id, 
    categories.name,
    messages.receiver_read, 
    project_ideas.project_id,
    COUNT(messages.ideas_id) AS num_of_messages,
    COUNT(project_ideas.ideas_id) AS num_of_ideas
FROM 
    create_project
    LEFT JOIN project_ideas ON create_project.project_id = project_ideas.project_id
    LEFT JOIN messages ON messages.project_id = create_project.project_id
    JOIN categories ON create_project.category = categories.category_id 
WHERE 
    create_project.user_id = {$_SESSION['user']['user_id']} 
    AND create_project.active = 1 
    AND create_project.completed = 1
GROUP BY project_ideas.project_id
ORDER BY create_project.date ASC

どんな助けでも感謝します。

4

2 に答える 2

-1

テーブル内の 1 つの行にcreate_project一致する複数の行がmessagesテーブル内にある場合、 内のmessages一致する行ごとに の行が 1 回表示されcreate_projectます。さらに、多数の結合があるため、重複する行が表示される場所が多数あります。たとえば、プロジェクトが複数のカテゴリに属している場合、結合するとcategories、プロジェクトが属するカテゴリごとに他のテーブルのすべての行が複製されます。これが実際にあなたのエラーの原因であることに賭けます。そして、それを非常に陰湿なものにしているのGROUP BYは、カウントと合計を行う関数を除いて、どこでも重複を隠すことです.

@Wrikkenのコメントは正しくて便利です。を削除するGROUP BYと、カウントに含まれるすべての行が表示されます。messagesテーブルの行が繰り返されていることがわかります。@Wrikken も言ったように、を使用してこれを軽減できますCOUNT(DISTINCT ...)。ただし、COUNT(DISTINCT ...). つまり、COUNT(DISTINCT ...)探しているデータに関して本当に論理的に意味があることを確認してください。

あなたのアクションの質問とは関係ありませんが、私が見た何かを指摘しなければなりませんでした (そして、私がよく知る前に自分自身をやった)。GROUP BYMySQL では、集計関数 (例: ) に含まれていない列を選択リストに含めることができますがCOUNT()、そうするのは悪い習慣です。結果は技術的に未定義です (参照: http://dev.mysql.com/doc/refman/5.0/en/group-by-extensions.html )。MySQL がこれを行うのは間違っていると思いますが、それは私の要求ではありません。他のデータベース システムでは、これにエラーとしてフラグが立てられます。

于 2013-09-24T00:48:41.367 に答える
-1

これを試して:

COUNT(messages.ideas_id) OVER(PARTITION BY  messages.project_id)  AS num_of_messages,
COUNT(project_ideas.ideas_id) OVER(PARTITION BY  project_ideas.project_id) AS num_of_ideas
于 2013-09-24T00:37:59.503 に答える