我遇到了一个查询问题,该问题没有输出我期望的内容,我无法让它工作。
查询
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的人。
希望有人能看到我的错误并帮助我。
答案 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