2012-01-11 127 views
1

基本上我需要创造一个用户与管理员的点比较它们的点而布置的输出TOP表之间的差异。 例如:SQL语句来显示每个用户选择一个用户选择

User3 | 0 //Everything was as admin had. 
User5 | 3 //One song had 2 points different from admin and one was off by one 
ect. 

在我的数据库中,我有三个表:

Table: rating 

+------------+---------+----------+---------+ 
| rating_id | user_id | song_id | points | 
+------------+---------+----------+---------+ 
| 1   | 1  | 4  | 0  | 
| 2   | 1  | 3  | 1  | 
| 3   | 3  | 2  | 3  | 
| 4   | 4  | 2  | 2  | 
| 5   | 2  | 1  | 4  | 


Table: songs 

+---------------+------------+ 
| song_name_id | song_name | 
+---------------+------------+ 
| 1    | Song1  | 
| 2    | Song2  | 
| 3    | Song3  | 
| 4    | Song4  | 
| 5    | Song5  | 

Table: users 

+----------+----------+----------+ 
| id  | username | password | 
+----------+----------+----------+ 
| 1  | User1 | passw | 
| 2  | User2 | wordp | 
| 3  | User3 | somet | 
| 4  | User4 | hings | 

应该是这样的(不是在任何编程语言):

Compare user_id > 1 with user_id=1 //Let's say that the comparable admin is user_id=1 
$result= ABS(user.points-admin.points)++; 

,并把这个到阵列:

username => result 

然后,当我通过排序结果这阵,我可以打印它作为顶级表 - 谁得到最接近的结果联系!

我tryed几个不同的解决方案,但从来没有得到正确的结果。

任何人都可以帮助我吗?

UPDATE:

谢谢!

随着连接的结果是:

+------------+---------+----------+---------+-----------+ 
| song_id |song_name| user_id |username |rating_diff| 
+------------+---------+----------+---------+-----------+ 
| 1   | Song1 | 1  | admin | 0   | 
| 2   | Song2 | 1  | admin | 0   | 
...etc... 

随着LEFT JOIN的结果是:

+------------+---------+----------+---------+-----------+ 
| song_id |song_name| user_id |username |rating_diff| 
+------------+---------+----------+---------+-----------+ 
| 1   | Song1 | 11  | user2 | NULL  | 
| 1   | Song1 | 10  | user1 | NULL  | 
| 1   | Song1 | 12  | user3 | NULL  | 
| 1   | Song1 | 1  | admin | 0   | 
| 2   | Song2 | 11  | user2 | NULL  | 
| 2   | Song2 | 10  | user1 | NULL  | 
| 2   | Song2 | 12  | user3 | NULL  | 
| 2   | Song2 | 1  | admin | 0   | 

..etc.. 

所以..东西是错误的,rating_diff不起作用。

+0

哪个SQL(MySQL和甲骨文,PostgreSQL的,等等),您使用(变更上rating r1联接是左连接,如果你不能保证管理员等级,每首歌曲。)? – 2012-01-11 11:07:32

回答

1

假设你想在一首歌曲按歌曲的基础上(而不是全部或所有歌曲平均)这种比较,尝试:

select r.song_id, 
     s.song_name, 
     r.user_id, 
     u.username, 
     abs(r.points - r1.points) rating_diff 
from rating r 
join songs s on r.song_id = s.song_name_id 
join users u on r.user_id = u.id 
join rating r1 on r.song_id = r1.song_id and r1.user_id = 1 
order by s.song_name, abs(r.points - r1.points) 

这应该排序的歌曲名称输出,然后由管理员点数和用户点数之间的差异决定。

+0

谢谢!我使用mySql,这个查询几乎可以正常工作,但还是有些问题。请问我可以看看我的问题,我更新了它。 :) – Algeron 2012-01-12 08:03:37

+0

但admin,默认用户具有相同的歌曲只是他们使用不同的顺序。 和比较应该是歌曲的歌,但结果SUM'ed像: USER1 20P错过 user2的15P错过 用户3 0P - 完全相同的顺序为管理 感谢;) – Algeron 2012-01-12 08:31:14

+1

@Algeron:哎呀, 我的错!我应该加入了song_id的评级,而不是rating_id。我现在修改了我的查询 - 你可以试试看吗? – 2012-01-12 10:48:37