MYSQL какой столбец строки имеет наибольшее значение - PullRequest
0 голосов
/ 20 июня 2020

, поэтому у меня есть такая таблица в MYSQL

+---------+------+------+------+------+
| Names   | MAP1 | MAP2 | MAP3 | MAP4 |
+---------+------+------+------+------+
| Player1 | 2    | 3    | 1    | 4    |
+---------+------+------+------+------+
| Player2 | 1    | 4    | 3    | 2    |
+---------+------+------+------+------+
| Player4 | 3    | 2    | 1    | 1    |
+---------+------+------+------+------+

Как бы я go выбирал, на какой карте у игрока больше всего. Так что-то вроде этого

+---------+------+
| Names   | MAPS |
+---------+------+
| Player1 | MAP1 |
+---------+------+
| Player2 | MAP2 |
+---------+------+
| Player4 | MAP1 |
+---------+------+

Ответы [ 3 ]

3 голосов
/ 20 июня 2020

Исправьте вашу схему. Нормализованный дизайн может выглядеть примерно так, где names и map будут компонентами ПЕРВИЧНОГО КЛЮЧА:

+---------+-----+-----+
| Names   | MAP | VAL |
+---------+-----+-----+
| Player1 |   1 |   2 |
| Player2 |   2 |   1 |
| Player4 |   3 |   3 |
| Player1 |   1 |   3 |
| Player2 |   2 |   4 |
| Player4 |   3 |   2 |
| Player1 |   1 |   1 |
| Player2 |   2 |   3 |
| Player4 |   3 |   1 |
| Player1 |   1 |   4 |
| Player2 |   2 |   2 |
| Player4 |   3 |   1 |
+---------+-----+-----+

Отсюда проблема тривиальна.

1 голос
/ 20 июня 2020

Strawberry верен - вы затрудняетесь из-за очень плохого дизайна схемы.

Есть разные способы достижения этого с вашей текущей схемой, но они все уродливые хаки:

 DELIMITER $$
 CREATE FUNCTION maxmap(map1 INT, map2 INT, map3 INT, map4 INT)
 RETURNS TEXT
 BEGIN
   DECLARE maxmapt TEXT;
   DECLARE maxmapv INT;
   SET maxmapt = 'map1';
   SET maxmapv = map1 ;
   IF (map2 > map1) THEN
      SET maxmapt = 'map2';
      SET maxmapv = map2 ;
   END IF;
   IF (map3 > maxmapv) THEN
      SET maxmapt = 'map3';
      SET maxmapv = map3 ;
   END IF;
   IF (map4 > maxmapv) THEN
      SET maxmapt = 'map4';
   END IF;
   RETURN maxmapt;
 END;
 $$
 SELECT player, maxmap
 FROM yourtable
 $$
0 голосов
/ 20 июня 2020

Используйте функцию greatest() в выражении CASE:

select Names,
  case greatest(MAP1, MAP2, MAP3, MAP4)
    when MAP1 then 'MAP1'
    when MAP2 then 'MAP2'
    when MAP3 then 'MAP3'
    when MAP4 then 'MAP4'
  end MAPS
from tablename

См. demo . Результатов:

| Names   | MAPS |
| ------- | ---- |
| Player1 | MAP4 |
| Player2 | MAP2 |
| Player4 | MAP1 |
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...