Добавление дополнительного столбца в таблицу

Мне нужна ваша помощь, потому что я понятия не имею, как я могу это сделать:

У меня есть три таблицы MySQL:

pcs_clubs идентификатор, короткое имя

pcs_candidates id, id_compet, id_club, id_season

pcs_matchs id, id_candidate_dom, id_candidate_ext, id_day, date_day, buts_dom, buts_ext, id_season, id_compet, проверка

Образец данных:

pcs_clubs

id   shortname
1    Barcelona
2    Real Madrid
3    Sevilla
4    Deportivo
5    Espanyol
6    Real Zaragoza

pcs_candidates

id   id_compet   id_club  id_season
1     1            1            1
2     1            2            1
3     1            3            1
4     1            4            1
5     1            5            1
6     1            6            1

pcs_matchs

+----+------------------+------------------+--------+------------+----------+----------+-----------+-----------+------------+
| id | id_candidate_dom | id_candidate_ext | id_day | date_match | buts_dom | buts_ext | id_season | id_compet | validation |
+----+------------------+------------------+--------+------------+----------+----------+-----------+-----------+------------+
| 1  | 1                | 6                | 1      | 2015-11-12 | 0        | 3        | 1         | 1         | 1          |
+----+------------------+------------------+--------+------------+----------+----------+-----------+-----------+------------+
| 2  | 2                | 5                | 1      | 2015-11-12 | 2        | 2        | 1         | 1         | 1          |
+----+------------------+------------------+--------+------------+----------+----------+-----------+-----------+------------+
| 3  | 3                | 4                | 1      | 2015-11-12 | 2        | 1        | 1         | 1         | 1          |
+----+------------------+------------------+--------+------------+----------+----------+-----------+-----------+------------+
| 4  | 6                | 2                | 2      | 2015-11-17 | 3        | 1        | 1         | 1         | 1          |
+----+------------------+------------------+--------+------------+----------+----------+-----------+-----------+------------+
| 5  | 4                | 1                | 2      | 2015-11-17 | 1        | 1        | 1         | 1         | 1          |
+----+------------------+------------------+--------+------------+----------+----------+-----------+-----------+------------+
| 6  | 5                | 3                | 2      | 2015-11-17 | 1        | 2        | 1         | 1         | 1          |
+----+------------------+------------------+--------+------------+----------+----------+-----------+-----------+------------+
| 7  | 3                | 6                | 3      | 2015-11-24 | 2        | 0        | 1         | 1         | 1          |
+----+------------------+------------------+--------+------------+----------+----------+-----------+-----------+------------+
| 8  | 2                | 4                | 3      | 2015-11-24 | 3        | 1        | 1         | 1         | 1          |
+----+------------------+------------------+--------+------------+----------+----------+-----------+-----------+------------+
| 9  | 1                | 5                | 3      | 2015-11-24 | 4        | 1        | 1         | 1         | 1          |
+----+------------------+------------------+--------+------------+----------+----------+-----------+-----------+------------+

Следующий запрос MySQL успешно сгенерировал рейтинговую таблицу желаемого соревнования и сезона:

SELECT
  shortname AS Team, Sum(P) AS P,Sum(W) AS W,Sum(D) AS D,Sum(L) AS L,
  SUM(F) as F,SUM(A) AS A,SUM(GD) AS GD,SUM(Pts) AS Pts
FROM(
  SELECT
    id_candidate_dom Team,
    1 P,
    IF(buts_dom > buts_ext,1,0) W,
    IF(buts_dom = buts_ext,1,0) D,
    IF(buts_dom < buts_ext,1,0) L,
    buts_dom F,
    buts_ext A,
    buts_dom-buts_ext GD,
    CASE WHEN buts_dom > buts_ext THEN 3 WHEN buts_dom = buts_ext THEN 1 ELSE 0 END PTS
  FROM pcs_matchs
  UNION ALL
  SELECT
    id_candidate_ext,
    1,
    IF(buts_dom < buts_ext,1,0),
    IF(buts_dom = buts_ext,1,0),
    IF(buts_dom > buts_ext,1,0),
    buts_ext,
    buts_dom,
    buts_ext-buts_dom GD,
    CASE WHEN buts_dom < buts_ext THEN 3 WHEN buts_dom = buts_ext THEN 1 ELSE 0 END
  FROM pcs_matchs WHERE validation=1 AND id_compet=1 AND id_season=1
) as tot
JOIN pcs_candidates t ON tot.Team=t.id_club
JOIN pcs_clubs c ON c.id=t.id_club
GROUP BY Team
ORDER BY SUM(Pts) DESC, SUM(GD) DESC;

Текущий результат:

+------+---------------+---+---+---+---+---+----+-----+------------+
|      | Team          | P | W | D | L | F | A  | GD  | Pts        |
+------+---------------+---+---+---+---+---+----+-----+------------+
| 1    | Sevilla       | 3 | 3 | 0 | 0 | 6 | 2  | 4   | 9pts       |
+------+---------------+---+---+---+---+---+----+-----+------------+
| 2    | Real Zaragoza | 3 | 2 | 0 | 1 | 6 | 3  | 3   | 6pts       |
+------+---------------+---+---+---+---+---+----+-----+------------+
| 3    | Real Madrid   | 3 | 1 | 1 | 1 | 6 | 6  | 0   | 4pts       |
+------+---------------+---+---+---+---+---+----+-----+------------+
| 4    | Barcelona     | 3 | 1 | 1 | 1 | 5 | 5  | 0   | 4pts       |
+------+---------------+---+---+---+---+---+----+-----+------------+
| 5    | Deportivo     | 3 | 0 | 1 | 2 | 3 | 6  | -3  | 1pts       |
+------+---------------+---+---+---+---+---+----+-----+------------+
| 6    | Espanyol      | 3 | 0 | 1 | 2 | 4 | 8  | -4  | 1pts       |
+------+---------------+---+---+---+---+---+----+-----+------------+

Я хотел бы добавить дополнительный столбец (текущая форма) в таблицу лиги на основе последних 5 матчей каждой команды до текущей даты. Мне нужно просто, с добавлением одного символа за матчи, если команда выиграла то W, если ничья то D, если проиграла то L. (если команда еще не сыграла 5 матчей, то не добавлять символ в столбец) как-то так это:

Желаемый результат:

+---+---------------+---+---+---+---+---+---+----+------+-------------------------------------+
|   |               |   |   |   |   |   |   |    |      | Form (from newest result to oldest based on date of match) |
+---+---------------+---+---+---+---+---+---+----+------+-------------------------------------+
| 1 | Sevilla       | 3 | 3 | 0 | 0 | 6 | 2 | 4  | 9pts | WWW                                 |
+---+---------------+---+---+---+---+---+---+----+------+-------------------------------------+
| 2 | Real Zaragoza | 3 | 2 | 0 | 1 | 6 | 3 | 3  | 6pts | LWW                                 |
+---+---------------+---+---+---+---+---+---+----+------+-------------------------------------+
| 3 | Real Madrid   | 3 | 1 | 1 | 1 | 6 | 6 | 0  | 4pts | WLD                                 |
+---+---------------+---+---+---+---+---+---+----+------+-------------------------------------+
| 4 | Barcelona     | 3 | 1 | 1 | 1 | 5 | 5 | 0  | 4pts | WDL                                 |
+---+---------------+---+---+---+---+---+---+----+------+-------------------------------------+
| 5 | Deportivo     | 3 | 0 | 1 | 2 | 3 | 6 | -3 | 1pts | LDL                                 |
+---+---------------+---+---+---+---+---+---+----+------+-------------------------------------+
| 6 | Espanyol      | 3 | 0 | 1 | 2 | 4 | 8 | -4 | 1pts | LLD                                 |
+---+---------------+---+---+---+---+---+---+----+------+-------------------------------------+

https://www.flashscore.com/standings/pvZBCt9T/vHE9SNDE/#live

Заранее спасибо!

ОБНОВЛЕННЫЙ ЗАПРОС (похоже, он работает)

    SELECT
      shortname AS Team, Sum(P) AS P,Sum(W) AS W,Sum(D) AS D,Sum(L) AS L,
      SUM(F) as F,SUM(A) AS A,SUM(GD) AS GD,SUM(Pts) AS Pts, date_day AS dateday, group_concat(match_result ORDER BY date_day DESC)
    FROM(
      SELECT
        id_candidate_dom Team,
        1 P,
        IF(buts_dom > buts_ext,1,0) W,
        IF(buts_dom = buts_ext,1,0) D,
        IF(buts_dom < buts_ext,1,0) L,
        buts_dom F,
        buts_ext A,
        buts_dom-buts_ext GD,
        CASE WHEN buts_dom > buts_ext THEN 3 WHEN buts_dom = buts_ext THEN 1 ELSE 0 END PTS,
        CASE
      WHEN buts_dom > buts_ext THEN 'W'
      WHEN buts_dom = buts_ext THEN 'D'
      WHEN buts_dom < buts_ext THEN 'L'
    END match_result,
        date_day
      FROM pcs_matchs
      UNION ALL
      SELECT
        id_candidate_ext,
        1,
        IF(buts_dom < buts_ext,1,0),
        IF(buts_dom = buts_ext,1,0),
        IF(buts_dom > buts_ext,1,0),
        buts_ext,
        buts_dom,
        buts_ext-buts_dom GD,
        CASE WHEN buts_dom < buts_ext THEN 3 WHEN buts_dom = buts_ext THEN 1 ELSE 0 END,
        CASE
      WHEN buts_dom < buts_ext THEN 'W'
      WHEN buts_dom = buts_ext THEN 'D'
      WHEN buts_dom > buts_ext THEN 'L'
    END match_result,
date_day
      FROM pcs_matchs WHERE validation=1 AND id_compet=1 AND id_season=1
    ) as tot
    JOIN pcs_candidates t ON tot.Team=t.id_club
    JOIN pcs_clubs c ON c.id=t.id_club
    GROUP BY Team
    ORDER BY SUM(Pts) DESC, SUM(GD) DESC

вы можете использовать CONCAT в обновлении (например, SET col = CONCAT(col,'new_value')), но, вероятно, было бы полезнее и лучше нормализации иметь другую таблицу для результатов и выполнять запрос соединения/подзапроса, когда вам нужно также отобразить форму - что, если (в будущее) вы хотите показать форму за последние 5 месяцев или лет, в зависимости от страницы/запроса

imposterSyndrome 02.07.2019 15:56

Привет, спасибо за ответ. Я не хочу добавлять другую таблицу для результатов. (было бы огромной работой изменить весь сайт). Просто я хотел бы добавить аббревиатуру результата (W или D или L) по раундам в последнюю колонку таблицы лиги (форма команды). Я думаю, что какой-нибудь эксперт mysql мог бы легко обновить мой код для получения желаемого результата (например, если команда выиграет, поставьте символ W, а если команда проиграла в следующем раунде, поставьте символ L, а если результат матча - ничья, то символ D ). Я не хочу показывать форму последних месяцев. Я надеюсь, что кто-то поможет мне обновить мой код...

Terminus 02.07.2019 16:19

Я не думаю, что вы можете сделать это с той структурой, которая у вас есть, потому что как вы можете знать, какие были последние 3 результата, не привязывая результат к дате матча - вы можете получить только итоги. Если вы не хотите сохранять результаты, вы можете добавить «форму» в качестве столбца в свою таблицу, и каждый раз, когда вы обновляете, вы можете использовать CONCAT, как я предложил, когда вы обновляете таблицу - вы хотели бы SUBSTR последние два символы SET form = CONCAT(SUBSTR(form, 2),'new_value')) - я не понимаю, как вы можете сделать это иначе без связи между результатами и датой

imposterSyndrome 02.07.2019 16:42
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
3
56
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

После добавления столбцов date_match и match_result к запросам в UNION добавьте следующий столбец в первое предложение SELECT:

group_concat(match_result ORDER BY date_match DESC)

Для результата матча:

CASE
  WHEN buts_dom > buts_ext THEN 'W'
  WHEN buts_dom = buts_ext THEN 'D'
  WHEN buts_dom < buts_ext THEN 'L'
END match_result

столбца match_result нет?

imposterSyndrome 02.07.2019 16:50

да, в таблице pcs_matchs есть только столбцы buts_dom (гол дома) и buts_ext (гол на выезде), но есть столбец date_match

Terminus 02.07.2019 16:53

Здравствуйте, Сэл, спасибо за ваш ответ, я добавил обновленный код в конец своего вопроса: результат: # 1222 - Используемые операторы SELECT имеют другое количество столбцов. И имя столбца даты матча - date_day, ранее я написал неправильно.

Terminus 02.07.2019 17:45

@Terminus: вам не хватает date_day во втором запросе UNION.

Sal 02.07.2019 17:59

Большое спасибо, Сэл, похоже, это работает, сейчас я тестирую и получаю больше результатов. Я надеюсь, что это сработает, еще раз спасибо!

Terminus 02.07.2019 18:11

Другие вопросы по теме