我有一些评估应用程序正在制作中,它几乎已经完成但我仍然坚持使用相当复杂的SQL查询。
首先,我使用的是链接表(MySQL):
table1:USERS(用户列表)
userID |名字|姓氏|电子邮件
table2:EVENT(事件列表)
eventID | event_typeID | event_name | EVENT_DESCRIPTION
table3:EVENT_TYPE(事件类型列表,每个事件类型都包含一个人参与其中的点数)
event_typeID | number_of_point
table4:USER_EVENT(带倍增系数的用户和事件ID列表)
user_eventID | userID | eventID |因子
获取所需数据的功能是: function getUsersWithPoints($ number_of_points_for_threshold)
它需要做的是获取名称,姓氏,电子邮件总点数和所有EVENT用户已经过的所有用户,这些用户的事件总数等于或大于$ number_of_points_for_threshold,但数据必须间接获取,而不是在另一个表中。
提前致谢。
答案 0 :(得分:0)
解决问题的一种方法我认为是为表中的每个用户存储一个运行的总点数(这可能是你的用户表)。只要您有活动,就应该更新该用户的总积分。
答案 1 :(得分: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上有索引
答案 2 :(得分: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