Есть ли что-то вроде цикла FOR в MySql? - PullRequest
0 голосов
/ 19 декабря 2018

У меня есть таблица с информацией о матчах, и мне нужно вернуть строку для каждого гола и каждой команды.Например:

+--------+-------+-------+-------+-------+
|  Match | Team1 | goal1 | goal2 | Team2 |
+--------+-------+-------+-------+-------+
|    1   | Red   |   1   |   0   | Blue  |   
+--------+-------+-------+-------+-------+
|    2   | Green |   2   |   1   | Black |   
+--------+-------+-------+-------+-------+

Я хочу запустить функцию для каждой строки, которая возвращает строку для каждой цели для каждой команды.Таким образом, мой результат функции будет следующим:

+--------+-------+-------+
|  Goal  | Match | Team  |
+--------+-------+-------+
|    1   |   1   |  Red  |  
+--------+-------+-------+
|    2   |   2   | Green | 
+--------+-------+-------+
|    3   |   2   | Green |  
+--------+-------+-------+
|    4   |   2   | Black | 
+--------+-------+-------+

Моя конечная цель состоит в том, чтобы мне нужно было по одной строке для каждого матча / команды / цели, чтобы заполнить вручную счетчик очков и минуты.Поскольку у меня более 40000 матчей, копирование, вставка каждой строки с подсчетом количества голов, является болью.

Я хотел бы начать с таблицы целей, в которую предварительно добавлено столько информации, сколько у меня уже есть.

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018

Пример синтаксиса цикла while в MySQL:

delimiter //

CREATE procedure yourdatabase.while_example()
wholeblock:BEGIN
  declare str VARCHAR(255) default '';
  declare x INT default 0;
  SET x = 1;

  WHILE x <= 5 DO
    SET str = CONCAT(str,x,',');
    SET x = x + 1;
  END WHILE;

  select str;
END//

Который печатает:

mysql> call while_example();
+------------+
| str        |
+------------+
| 1,2,3,4,5, |
+------------+

Пример синтаксиса цикла FOR в MySQL:

delimiter //

CREATE procedure yourdatabase.for_loop_example()
wholeblock:BEGIN
  DECLARE x INT;
  DECLARE str VARCHAR(255);
  SET x = -5;
  SET str = '';

  loop_label: LOOP
    IF x > 0 THEN
      LEAVE loop_label;
    END IF;
    SET str = CONCAT(str,x,',');
    SET x = x + 1;
    ITERATE loop_label;
  END LOOP;

  SELECT str;

END//

Который печатает:

mysql> call for_loop_example();

    +-------------------+
    | str               |
    +-------------------+
    | -5,-4,-3,-2,-1,0, |
    +-------------------+
    1 row in set (0.00 sec)

Учебник: http://www.mysqltutorial.org/stored-procedures-loop.aspx

0 голосов
/ 19 декабря 2018

Создайте таблицу, содержащую числа от 1 до максимального количества возможных целей, т.е.

CREATE TABLE numbers (
    num INT PRIMARY KEY
);
INSERT INTO numbers VALUES (1), (2), (3), (4), (5), (6), ...

Затем вы можете объединить эту таблицу со своей исходной таблицей:

SELECT num AS Goal, `Match`, Team
FROM numbers
JOIN (
    SELECT Team1 AS Team, goal1 AS goals, `Match`
    FROM matches
    UNION
    SELECT Team2 AS Team, goal2 AS goals, `Match`
    FROM matches
) ON num <= goals
...