2015-03-02 5 views
3

Привет, ребята, я до сих пор довольно новичок в MySQL, и я просто столкнулся с проблемой, которую я не могу понять.Обновление столбца MySql на основе другого столбца

Скажем, у меня есть таблица под названием «следы» со следующими столбцами и выборочных данных

track_hash | track_order 
abc  | 1 
abc  | 2 
abc  | 3 
abc  | 4 
def  | 1 
def  | 2 
ghi  | 1 

Таким образом, точка, что, когда я отобразить дорожки, дорожки должны быть отсортированы по порядку дорожки. Поэтому, если я хочу отобразить все дорожки из abc, он отобразит его на основе порядка треков (1, 2, 3). Трек hash «def» имеет две дорожки ... и т. Д.

Итак, в настоящее время в моей БД у меня только пустой столбец track_order. Как я собираюсь заполнить столбец track_order правильными данными?

+0

так что вы хотите, чтобы каждый хэш имел последовательный track_order от 1 до N? Нет никаких очевидных причин для их заказа и нет критериев для этого. – amenadiel

+0

Вы имеете в виду через php или просто mysql? Вы ищете одно время, или вы всегда хотите заказать трек? – Bono

+0

@Bono Проделать это через mysql. У меня уже есть БД, настроенная с большим количеством информации о треке. Некоторые треки хэшируются вместе, и я выясню код php, чтобы впоследствии изменить значение порядка дорожек. Мне просто нужно сначала создать колонку порядка треков –

ответ

1

Вы можете сделать это с помощью update и определенной пользователем переменной. Однако у вас есть фундаментальная проблема. Таблицы SQL представляют собой неупорядоченные множества. Таким образом, в таблице нет встроенного упорядочения, если только столбец не указывает порядок.

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

update tracks t 
    set t.track_order = if(@th = t.track_hash, (@rn := coalesce(@rn, 0) + 1), 
          if(@th := t.track_hash, @rn := 1, @rn := 1) 
         ) 
    order by t.track_hash, t.id; 

Вы не должны инициализировать переменные для этой работы, но вы можете инициализировать их перед update.

+0

. Проблема в том, что вы никогда не устанавливаете «@th» в обновленный track_hash ... Это просто заполнит всю мою таблицу с 1 –

+0

@DavidYuan. , , Второе предложение 'if' устанавливает' @ th'. На первой итерации первый 'if()' будет терпеть неудачу, и тогда будет установлено правильное значение. –

+0

Я просто попробовал это, и он установил всю мою колонку в 1. Из моего понимания ... первая итерация перейдет ко второму оператору if, но второй оператор if установит только @rn = 1? –

0

Я думаю, вы, возможно, ищете user defined variables.

Вы могли бы сделать что-то вроде этого:

SET @t1=0; 
insert into `tablename` (track_order) values(@t1 := @t1+1) where id = some_id 

Я не совсем уверен, как вы бы делать это для каждой записи в базе данных. Я думаю, что это должно сработать, но это делает это на основе id (вы можете сделать это track_hash, если это будет лучше). Не уверен, что это вам подходит?

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

+0

У меня такая же проблема, как выяснять способ сделать это для каждого трека. Ваш способ решает проблему обновления одного целого track_hash в одно и то же время, но в настоящее время у меня есть около 8000+ разных треков в моей базе :( –

+0

его хорошо! Спасибо за помощь! –

+0

Быстрый вопрос; у вас есть что-то вроде столбца id? Вы можете сделать это так же, если это все инкрементные идентификаторы. – Bono

Смежные вопросы