MySQL中的连接和计数问题

MySQL中的连接和计数问题,mysql,sql,join,Mysql,Sql,Join,我对这个MySQL select查询感到困惑,我得到了正确的信息,除了COUNT(messages)和COUNT(project\u ideas)返回的信息是原来的两倍 SELECT create_project.title, image1, create_project.description, create_project.date, create_project.active, create_project.completed,

我对这个MySQL select查询感到困惑,我得到了正确的信息,除了
COUNT(messages)
COUNT(project\u 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
任何帮助都将不胜感激。

请尝试以下方法:

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

如果
create\u项目
表中有多行与
messages
表中的一行相匹配,则
messages
中的行将在
create\u项目
中的每个匹配行显示一次。此外,由于有许多联接,因此有许多地方可以显示重复的行。例如,如果一个项目属于多个类别,则您对
类别的联接将导致其他表中的每一行对于项目所属的每个类别都重复。我敢打赌这就是你犯错误的原因。让它如此阴险的是,
groupby
隐藏了所有的重复,除了在进行计数和求和的函数中

@瑞肯的评论是正确和有用的。如果按
删除
分组,您将看到计数中包含的每一行。您应该看到
消息
表中的行是重复的。正如@Wrikken所说的,您可以通过使用
COUNT(DISTINCT…)
来缓解这种情况。但是,在用
COUNT(DISTINCT…
解决问题之前,我会尝试确保联接正确或表数据正确。也就是说,确保
COUNT(DISTINCT…
在您所查找的数据方面真正具有逻辑意义


与你的行动问题无关,我必须指出一些我看到的东西(在我知道之前我已经做了)。尽管MySQL允许您在选择列表中包含不在
分组依据
或聚合函数(例如,
COUNT()
)中的列,但这样做是不好的做法。结果在技术上尚未定义(请参阅)。我认为MySQL这样做是错误的,但这不是我的决定。其他数据库系统会将此标记为错误。

如果您省略了
分组依据
,您可以看到原因。您最好的选择是
计数(不同的消息。一些消息的列)
,可能是主键…我还看到一个SQL注入漏洞。在PDO中使用准备好的语句,而不是将变量的值直接放入SQL。即使您认为会话变量是干净的,您仍然在掷骰子。阅读标签和标题。MySQL没有窗口功能。我今天第二次被MySQL烧坏了。很抱歉。