MySQL 不是预期的输出 - YEAR() 不起作用

标签 mysql left-join

我的查询存在问题,该查询未输出我期望的内容,并且无法使其正常工作。

查询是

SELECT COUNT(event_type_id), userprofiles.id as userprofile_id, users.first_name, users.last_name 
FROM users, userprofiles
            LEFT JOIN event_matches ON event_matches.userprofile_id = userprofiles.id
            AND event_type_id = 1
            LEFT JOIN activities ON activities.id = event_matches.activity_id
            AND YEAR(activities.start) = 2012
            WHERE userprofiles.home_id = 2
            AND users.id = userprofiles.user_id
            GROUP BY userprofiles.id
            ORDER BY COUNT(event_type_id) DESC

但是当我运行这个查询时,它会获取所有事件,而不仅仅是 2012 年的事件,看起来 LEFT JOIN 做了一些事情。如果我不使用 LEFT JOIN 而是使用 JOIN,则查询可以工作,但是我只能得到 2012 年 event_type_id = 1 的用户。但是我使用 LEFT JOIN 的原因是因为我想拥有所有用户,而且不仅仅是那些拥有 event_type_id 的人。

希望有人能看到我的错误并帮助我。

最佳答案

那又怎样——用英语你想得到...例如:对于 home_id = 2 的所有用户配置文件,2012 年中有多少类型 1 的事件。通过执行左连接,你是说我想要所有配置文件无论是否参加类型 1 的事件,Home_ID = 2 的值都相同。如果是这种情况,您可能希望将它们从 LEFT JOIN 更改为仅 JOIN (INNER JOIN)

这适用于所有用户配置文件,无论 2012 年内是否存在类型 1 的实际事件,这只关心是否找到类型 1 的事件

SELECT 
      COUNT(event_type_id), 
      userprofiles.id as userprofile_id, 
      users.first_name, 
      users.last_name 
   FROM 
      userprofiles
         JOIN users
            ON userprofiles.user_id = users.id
         LEFT JOIN event_matches 
            ON userprofiles.id = event_matches.userprofile_id
            AND event_matches.event_type_id = 1
            LEFT JOIN activities 
               ON event_matches.activity_id = activities.id 
               AND YEAR(activities.start) = 2012
   WHERE 
      userprofiles.home_id = 2
   GROUP BY 
      userprofiles.id
   ORDER BY 
      COUNT(event_type_id) DESC

通过更改为细粒度事件表,您将得到事件类型计数 = 1 并且年份为 2012 年

SELECT 
      COUNT(activities.id), 
      ... rest of query...
  ORDER BY 
      COUNT(activities.id) DESC

如果您只想要那些在 2012 年实际发生过类型 1 事件的个人资料,请更改为 JOIN

SELECT 
      COUNT(event_type_id), 
      userprofiles.id as userprofile_id, 
      users.first_name, 
      users.last_name 
   FROM 
      userprofiles
         JOIN users
            ON userprofiles.user_id = users.id
         JOIN event_matches 
            ON userprofiles.id = event_matches.userprofile_id
            AND event_matches.event_type_id = 1
            JOIN activities 
               ON event_matches.activity_id = activities.id 
               AND YEAR(activities.start) = 2012
   WHERE 
      userprofiles.home_id = 2
   GROUP BY 
      userprofiles.id
   ORDER BY 
      COUNT(event_type_id) DESC

关于MySQL 不是预期的输出 - YEAR() 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21314832/

相关文章:

c# - EF,如何提高查询性能

java - Android JDBC 不工作 : ClassNotFoundException on driver

php - 在 Laravel 中获取查询而不是按名称替换外键

mysql - 选择查询 Yii2 中的左连接 - 'single' 中的未知列 'on clause'

MySql 与按相关性和另一列的顺序匹配

MySQL 多行连接

sql - 无法应用于 Athena 中的 bigint、varchar

MySQL子查询和连接3个表

mysql - 左连接两个表中的日期时间列仅涉及日期时间?

mysql - 仅在字符串参数不为 null 或空字符串时才使用 where 条件