Mysql сводка из столбцов - PullRequest
0 голосов
/ 09 июля 2020

Мне нужно объединить столбцы вместе в каждой строке, например, в таблице лидеров. Как это выглядит:

Name | country | track 1 | track 2 | track 3 | Total 
John     ENG       32        56        24
Peter    POL       45        43        35

Здесь две проблемы, я мог бы использовать

update 'table' set Total = track 1 + track 2 + track 3

НО это не всегда 3 трека, где-то от 3 до 20. Secound если я не суммирую его в mysql, я не могу отсортировать его, когда представляю данные в HTML / php.

Или есть какой-нибудь другой умный способ построить списки лидеров?

Ответы [ 3 ]

0 голосов
/ 09 июля 2020

Как и другие, вам необходимо изменить дизайн вашей базы данных. Вам нужна связь Один-ко-многим между таблицей Leaderboard и новой таблицей Tracks . Это означает, что один Пользователь может иметь множество треков, причем каждый трек представлен записью в таблице треков.

Эти две базы данных должны быть связаны внешним ключ, в данном случае это может быть поле user_id .

Поле total в таблице лидеров может обновляться каждый раз, когда вставляется или обновляется новый трек, или вы могли бы запрос, похожий на тот, который вы хотели. Вот как такой запрос мог бы выглядеть :

UPDATE leaderboard SET total = (
  SELECT SUM(track) FROM tracks WHERE user_id = leaderboard.user_id
)

Я рекомендую вам прочитать об отношениях с базами данных, вот ссылка:

0 голосов
/ 10 июля 2020

У меня все еще много проблем с этим ... Я не думаю, что проблема в базе данных, но я думаю, что это больше похоже на то, как я представляю дату в Интернете. Я могу получить все данные и т.д. c. Единственное, что у меня не заполнено правильно. Я искал таблицы лидеров и действительно не понимаю, как они строят их с активным порядком и c. лайк. https://www.pgatour.com/leaderboard.html Как они строят такие списки лидеров? С сортировкой и всем.

0 голосов
/ 09 июля 2020

Вам нужно перепроектировать свою таблицу, чтобы в ней были столбцы для имени, страны, номера дорожки и данных.Тогда вместо этого, если у вас есть широкая таблица всего с 3 номерами дорожек, у вас будет высокая тонкая таблица, в которой каждая строка является данными для данного имени , страна и трек.

Затем вы можете подвести итог, используя что-то вроде

 SELECT 
     country, 
     name, 
     sum(data) as total
 FROM trackdata 
 GROUP BY
     name, 
     country
ORDER BY
    sum(data) desc

Взгляните здесь , где я сделал скрипт SQL, показывающий, как это работает как вы этого хотите

В зависимости от ваших ожидаемых данных, вам действительно может быть лучше иметь отдельную таблицу для страны, где каждое название страны появляется только один раз (а также, возможно, для имени). Например, если Джон всегда связан с ENG, тогда у вас есть повторяющаяся группа, и лучше удалить эту ассоциацию из таблицы выше, которая на самом деле связана с оценками на треке, а не с тем, кто в какой стране находится, и поместите это в свою собственную таблицу, которая затем присоединяется к данным трека.

Полное решение может иметь следующие таблицы

**Athlete**
athlete_id
athlete_name
(other data about athletes)

**Country**
country_id
country_name
(other data about countries)

**Track**
Track_id       
Track_number
(other data about tracks)

**country_athlete**   (this joining table allows for the one to many of one country having many athletes
country_athlete_id
country_id
athlete_id

**Times**
country_athlete_id   <--- this identifies a given combination of athlete and country 
track_id             <--- this identifies the track       
data                 <--- this is where you store the actual time

Оно может усложняться в зависимости от ваших данных, например, может ли один и тот же номер трека появляться в разных странах ? в таком случае вам понадобится еще одна соединительная таблица, чтобы присоединить один трек-номер ко многим странам.

В качестве альтернативы, даже с плохим дизайном моего примера скрипки SQL, было бы неплохо указать название, страну и отслеживать первичный ключ, так что вы можете иметь только одно значение «данных» для данной комбинации имени, страны и трека. Однако это решение и решение о нормализации вашей таблицы на несколько объединенных таблиц будет основано на данных, которые вы ожидаете получить.

Но в любом случае, как только вы скажете: «Я не знаю, сколько треков там будет «тогда вы должны начать думать», данные каждого трека отображаются в одной СТРОКЕ, а не в одной КОЛОНКЕ ».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...