Массовый запрос из одного запроса с использованием модуля обещания запроса
Вот мои таблицы sql для разделенного клона:
#1) Table name: sp_user
|user_id |username
+--------------------
|1 |user1
|2 |user2
|3 |user3
|4 |user4
#2) Table name: sp_group
|group_id |groupname |bill
+--------------------------------
|1 |shopping |2000
|2 |lunch |1000
Расходы на группу 'movie' распределяются между пользователями - user1, user2, а расходы на группу 'lunch' распределяются между пользователями - user1, user2, user3, user4.
#3)Table name: sp_usergroup
|group_id |user_id
+---------------------
|1 |1
|1 |2
|2 |1
|2 |2
|2 |3
|2 |4
Использую обещание запроса для кодирования конечной точки /user_expense? Uname=user1, которое будет таким, как показано ниже:
router.route("/user_expense").get(function (req, res) {
var uname = req.param('name');
// select query to get the user_id for 'user1' and store it as uid
.......
// select query to get the list of group_id for uid
// set user_exp = 0
for (i= each of the group_id) {
// select count(*) for group_id[i] to get the number of users in this group and store it as ct
// select the bill for group_id[i] and store it as b
// user_exp += ct / b
}
res.send(user_exp);
}
Для пользователя 1 сумма расходов должна быть 1250/- (1000 + 250). Будет ли работать массовый запрос для этого отдельного запроса и как это сделать?
1 ответ
Да, вы можете сделать это в одном запросе
- сначала выберите user_id из таблицы sp_user по имени пользователя.
- для этого user_id выберите group_id из sp_usergroup.
- и посчитать user_id из таблицы sp_usergroup для этих group_id.
- и присоединить таблицу sp_group и вновь созданную таблицу к group_id
- получить среднее значение для каждого group_id пользователя.
- Теперь сделайте сумму всех этих средних. Вы получаете user_exp.
Вы можете запустить эти команды sql в одном запросе SQL, как это.
SELECT SUM(avg) AS user_exp
FROM (
SElECT sp_group.bill/COUNT(sp_usergroup.user_id) AS avg
FROM sp_usergroup
INNER JOIN sp_group ON sp_usergroup.group_id = sp_group.group_id
GROUP BY sp_usergroup.group_id,sp_group.bill
HAVING sp_usergroup.group_id IN (
SELECT group_id
FROM sp_usergroup
WHERE user_id= (
SELECT user_id
FROM sp_user
WHERE username= 'user1')
)
) AS result