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

时间:2014-01-23 17:07:04

标签: 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的原因是因为我想让alle用户,而且不仅仅是拥有event_type_id的人。

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

1 个答案:

答案 0 :(得分:1)

那么是什么 - 你想要英语... Ex:对于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的HAD事件的那些配置文件,请更改为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