有没有一种方法可以根据MySql中的值所属的列对其进行排序


Is there a way to rank values in MySql according to what column they belong to?

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

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

所以现在,用户正在输入他们最喜欢的语言。第一选择(pick_1)将是喜爱的编程语言,而第二选择(pick2)将是第二喜爱的程序语言等等

我如何组织它,以便根据编程语言的列给出一个点值。所以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。

感谢您的阅读。

您需要一个更简单的结构

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

通过这种方式,您可以执行简单的sum(points) group by pick

对于仅SQL的解决方案,我会规范化您的结构,并将pick放在不同的表中:

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

正如在这个小提琴

这样也很容易添加限制,这样人们就不能对一种语言进行多次投票,或者对两种不同的语言进行相同数量的投票。