有没有办法根据它们所属的列在MySql中对值进行排名?

时间:2013-09-05 07:05:54

标签: php mysql sql rank

好的,我们假设我们有4列和3行数据。

|user_id|pick_1|pick_2|pick_3|
-------------------------------
|fred   |C++   |java  | php  |
------------------------------
|eric   |java  |C++   | php   |
------------------------------
|sam    | C++  | php  | java |
------------------------------

现在,用户正在输入自己喜欢的语言。第一个选择(pick_1)将是最喜欢的编程语言,第二个选择(pick_2)将是第二个最喜欢的编程语言等。

我如何以某种方式组织它,以便根据编程语言的列来给出一个点值。所以也许pick_1可以给3分,pick_2可以给2分,pick_3可以给1分。

因此,当你计算得分时,C ++将获得8分,java将获得6分,而php将获得4分。

这样我可以给出更有利的编程语言的总体排名。像这样

  |rank|language|points|
  ----------------------
  |  1 |  C++   | 8    |
  ----------------------
  |  2 |  java  | 6    |
  ----------------------
  |  3 |  php   | 4    |
  ----------------------

它甚至不需要有点系统,我只是想不出另一种方法来按照喜欢和不喜欢的等级对语言进行排名。所以如果有另一种方法可以产生相同的结果,请告诉我。否则我怎么能这样做。最好只在MySql中。我目前正在使用PHP。

感谢您的阅读。

2 个答案:

答案 0 :(得分:3)

您需要更简单的结构

User_ID | Pick | Points
Fred      c++     3
Fred      php     2
Fred      java    1

这样你可以做一个简单的sum(points) group by pick

答案 1 :(得分:1)

对于SQL唯一的解决方案,我会规范化您的结构,并将选择放在另一个表中:

users: user_id; user_name
picks: pick_id; user_id; language; points;

然后你将把你的数据放在两个表中:

| user_id | user_name |
-----------------------
| 1       | Fred      |
-----------------------
| 2       | Eric      |
-----------------------
| 3       | Sam       |
-----------------------

| pick_id | user_id   | language | points    |
---------------------------------------------
| 1       | 1         | C++      | 1         |
---------------------------------------------
| 2       | 1         | Java     | 2         |
---------------------------------------------
| 3       | 1         | php      | 3         |
---------------------------------------------
| 4       | 2         | Java     | 1         |
---------------------------------------------
| 5       | 2         | C++      | 2         |
---------------------------------------------
| 6       | 2         | php      | 3         |
---------------------------------------------
| 7       | 3         | C++      | 1         |
---------------------------------------------
| 8       | 3         | Java     | 2         |
---------------------------------------------
| 9       | 3         | php      | 3         |
---------------------------------------------

然后使用以下查询来获取所需的结果:

SELECT language, SUM(points) FROM users JOIN picks ON users.user_id=picks.user_id GROUP BY language

this fiddle

所示

通过这种方式,添加约束也很容易,因此人们不能再投票一次语言,或者给两种不同的语言投票。