0

我对这个 MySQL 选择查询感到困惑,我得到了正确的信息,但返回的信息COUNT(messages)是原来的COUNT(project_ideas)两倍。

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

尝试这个:

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 回答
-1

如果您的表中有不止一行与create_project表中的单行匹配messages,则 中的行将messages针对 中的每个匹配行显示一次create_project。此外,由于您有许多连接,因此您有很多地方可以显示重复的行。例如,如果一个项目属于多个类别,则您的联接categories将导致其他表中的每一行对于项目所属的每个类别都重复。我敢打赌这实际上是你错误的根源。让它如此阴险的是,GROUP BY除了计算和求和的函数之外,它到处都隐藏了重复。

@Wrikken 的评论是正确且有用的。如果删除GROUP BY,您将看到计数中包含的每一行。在那里你应该看到messages表中的行是重复的。正如@Wrikken 还所说,您可以通过使用COUNT(DISTINCT ...). 但是,在使用COUNT(DISTINCT ...). 也就是说,确保COUNT(DISTINCT ...)就您要查找的数据而言,这确实具有逻辑意义。

与您的行动问题无关,我不得不指出我看到的一些东西(并且在我知道更好之前已经做了自己)。尽管 MySQL 允许您在选择列表中包含不在 aGROUP BY或聚合函数中的列(例如,COUNT()),但这样做是不好的做法。结果在技术上是未定义的(参见:http ://dev.mysql.com/doc/refman/5.0/en/group-by-extensions.html )。我认为 MySQL 这样做是错误的,但这不是我的决定。其他数据库系统会将其标记为错误。

于 2013-09-24T00:48:41.367 回答