0

我正在制作某种评估应用程序,它几乎完成了,但我遇到了相当复杂的 SQL 查询。

首先是我正在使用的链接表(MySQL):

表 1:USERS(用户列表)

用户名 | 姓名 | 姓氏 | 电子邮件


表2:事件(事件列表)

事件ID | 事件类型ID | 事件名称 | 事件描述


表 3:EVENT_TYPE(事件类型列表,每个都有一个人参与时获得的分数)

事件类型ID | number_of_point


表 4:USER_EVENT(用户和事件 ID 的列表以及乘法因子)

用户事件ID | 用户名 | 事件ID | 因素


获取所需数据的函数是:function getUsersWithPoints($number_of_points_for_threshold)


它需要做的是获取姓名,姓氏,电子邮件总点数和所有事件用户已经为事件中的总点数等于或大于 $number_of_points_for_threshold 的所有用户,但必须间接获取数据,而不获取它在另一个表中。

提前致谢。


4

3 回答 3

0

我认为解决问题的一种方法是将每个用户的总积分存储在一个表中(它可能是你的用户表)。每当您有活动时,您都应该更新该用户的总积分。

于 2012-06-03T20:23:10.250 回答
0

首先,我假设 USER_EVENT 将 event_typeID 作为列。我不能在其他任何地方引用 event_typeID。尝试这样的事情:

SELECT name, surname, email, sum(number_of_point) 
FROM user, user_event, event_type 
WHERE user.userID = user_event.userID AND user_event.event_typeID = event_type.event_typeID 
GROUP BY user.userID
HAVING sum(number_of_point) > :threshold
ORDER BY name ASC

确保您在 user_event.userID 和 user_event.event_typeID 上有索引

于 2012-06-03T20:37:21.087 回答
0

一点都不复杂,就用这个:

SELECT name, surname, email, SUM(sum_points) AS total_points
FROM (SELECT userID, (SUM(factor) * number_of_point) AS sum_points
      FROM USER_EVENT AS ue INNER JOIN EVENT AS e ON ue.eventID = e.eventID
      INNER JOIN EVENT_TYPE AS et ON e.event_typeID = et.event_typeID
      GROUP BY userID, event_typeID, number_of_point) AS sub
INNER JOIN USERS AS u ON sub.userID = u.userID
GROUP BY u.userID, name, surname, email
HAVING total_points >= $number_of_points_for_threshold

更新:首先,此查询考虑了每个用户有多少事件(不仅仅是他有多少不同的事件),其次,您希望如何实现这一点,您需要连接所有名称(并且分别所有描述)一起 - 只需使用不同的查询:

SELECT e.event_name, e.event_description, ue.factor, (ue.factor * et.number_of_point) AS sum_points
FROM USER_EVENT AS ue INNER JOIN EVENT AS e ON ue.eventID = e.eventID
INNER JOIN EVENT_TYPE AS et ON e.event_typeID = et.event_typeID
WHERE ue.userId = @userId
于 2012-06-03T21:56:25.340 回答