Mysql 带排序的SQL查询
请编写一个SQL脚本来整理数据,以提供帮助。Mysql 带排序的SQL查询,mysql,sql,performance,Mysql,Sql,Performance,请编写一个SQL脚本来整理数据,以提供帮助。 一个关键困难-需要创建一个额外的列来进行排序。 我试图尽可能详细地描述情况。 让我们开始吧。有以下表格: 我们将收到一个用户ID并返回数据,只有那些没有他,但还有其他人 下一步:按人工创建的列排序。 下一步,我会一步一步来 那么我所说的人造柱是什么意思: 此列将包含估算值之间的差异。因此,要获得它,您需要首先执行一些操作: 根据这类信息,设置用户与其他用户在评价中的差值,并得到平均分 以下两张图片显示了相同的数据,然后是计算本身,在我看来,这非常
一个关键困难-需要创建一个额外的列来进行排序。
我试图尽可能详细地描述情况。
让我们开始吧。有以下表格:
我们将收到一个用户ID并返回数据,只有那些没有他,但还有其他人
下一步:按人工创建的列排序。
下一步,我会一步一步来
那么我所说的人造柱是什么意思:
此列将包含估算值之间的差异。因此,要获得它,您需要首先执行一些操作:
根据这类信息,设置用户与其他用户在评价中的差值,并得到平均分
以下两张图片显示了相同的数据,然后是计算本身,在我看来,这非常简单。
本栏计算如下:
User with 2nd id:
1: 5 - 1 = 4;
2: 2 - 9 = -7;
3: next data what is in user 1 - absent in user 2, and we ease pass it;
User with 3rd id:
1: 3 - 1 = 2;
2: the next data's is absent in user with 3rt id;
3: 8 – 9 = -1;
4: 6 – 2 = 4;
5: passed;
End in the end:
User_2 will have new mark = -1.5
User_3 will have new mark = 1.66666
最后,我需要返回表格:
但这还不是全部。通常情况下,数据会重复,我希望从获得的数据中获得平均结果。请看以下示例:
这就是结局。专家们,我真的需要你们的帮助。我自己教sql代码,但对我来说很难。
想到制作脚本如下:
SELECT d.data, (d.mark + myCount(d.user, 1)) newOrder
FROM info d
WHERE -- data from user_1 NOT equal data from other users
ORDER BY newOrder;
但是脚本将执行很多时间,因为它使用自己的函数,可以对每个用户进行查询,而不是记录。我希望有人能够完成这项任务。按照您的步骤:
首先,我们需要将数据与所选用户隔离(假设为1):
现在,我们计算每个其他用户的分数(同样,所选用户为1):
我们可以查询平均值:
SELECT d.user user, AVG(d.mark - s.mark) mark
FROM info d JOIN sel_user s USING (data)
WHERE d.user <> 1 GROUP BY user;
user mark
---------- ----------
2 -1.5
3 1.66666666
与我的想法类似,但我使用的是自连接原则。
SELECT d.user user, d.mark - s.mark mark
FROM info d JOIN sel_user s USING (data)
WHERE d.user <> 1;
user mark
---------- ----------
2 4
2 -7
3 2
3 -1
3 4
SELECT d.user user, AVG(d.mark - s.mark) mark
FROM info d JOIN sel_user s USING (data)
WHERE d.user <> 1 GROUP BY user;
user mark
---------- ----------
2 -1.5
3 1.66666666
SELECT d.user user, mark FROM info d
WHERE d.user <> 1 AND d.data NOT IN (SELECT data FROM sel_user);
user mark
---------- ----------
2 4
3 3
3 10
SELECT d.user user, d.data, d.mark + d2.mark AS neworder FROM info d JOIN (
SELECT d.user user, AVG(d.mark - s.mark) mark
FROM info d JOIN sel_user s USING (data)
WHERE d.user <> 1 GROUP BY user
) d2 USING (user)
WHERE d.data NOT IN (SELECT data FROM sel_user)
ORDER BY neworder DESC;
user data neworder
---------- ---------- ----------------
3 6 11.6666666666667
3 3 4.66666666666667
2 5 2.5
SELECT data, AVG(neworder) final FROM (
SELECT d.user user, d.data, d.mark + d2.mark AS neworder FROM info d JOIN (
SELECT d.user user, AVG(d.mark - s.mark) mark
FROM info d JOIN sel_user s USING (data)
WHERE d.user <> 1 GROUP BY user
) d2 USING (user)
WHERE d.data NOT IN (SELECT data FROM sel_user)
)
GROUP BY data
ORDER BY final DESC;
data final
---------- ----------------
6 11.6666666666667
3 4.66666666666667
5 2.5