Mysql 带排序的SQL查询

Mysql 带排序的SQL查询,mysql,sql,performance,Mysql,Sql,Performance,请编写一个SQL脚本来整理数据,以提供帮助。 一个关键困难-需要创建一个额外的列来进行排序。 我试图尽可能详细地描述情况。 让我们开始吧。有以下表格: 我们将收到一个用户ID并返回数据,只有那些没有他,但还有其他人 下一步:按人工创建的列排序。 下一步,我会一步一步来 那么我所说的人造柱是什么意思: 此列将包含估算值之间的差异。因此,要获得它,您需要首先执行一些操作: 根据这类信息,设置用户与其他用户在评价中的差值,并得到平均分 以下两张图片显示了相同的数据,然后是计算本身,在我看来,这非常

请编写一个SQL脚本来整理数据,以提供帮助。
一个关键困难-需要创建一个额外的列来进行排序。
我试图尽可能详细地描述情况。

让我们开始吧。有以下表格:

我们将收到一个用户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