ОБНОВЛЕНИЕ Таблица SQL со случайными уникальными числами - PullRequest
0 голосов
/ 04 ноября 2019

Привет, у меня проблема с обновлением SQL. Я хочу вставить случайное уникальное число от 0-2 до черновика столбца в черновике таблицы (где лобби столбцов равно 1).

У меня есть это, но оно заканчивается ошибкой: # 1093 - Вы не можете указать цельТаблица 'черновик' для обновления в предложении FROM

UPDATE draft 
SET draft = (
  SELECT FLOOR(RAND() * 3) AS random_num 
  WHERE "random_num" NOT IN (
    SELECT draft FROM draft
  )
) 
WHERE lobby = 1

Диапазон RAND будет генерироваться динамически на уровне приложения, поэтому результат должен быть таким: 3 записи = уникальные случайные 0-2, 9 записей = уникальные числа из0-8 и т. Д.

Старт

ID DRAFT LOBBY
1  null  1
2  null  1
3  null  1

Результат

ID DRAFT LOBBY
1  1     1
2  2     1
3  0     1

Любая помощь, пожалуйста?

Редактировать

Я обновилзапрос к этому:

UPDATE draft 
SET draft = (
  SELECT FLOOR(RAND() * 3) AS random_num 
  WHERE "random_num" NOT IN (SELECT draft FROM (SELECT * FROM draft) AS temp)
) 
WHERE lobby = 1

Никакая синтаксическая ошибка не появляется, но не меняет строки, не знаю почему.

Ответы [ 2 ]

1 голос
/ 04 ноября 2019

Вы можете сделать:

update draft d cross join
       (select n.*
        from (select 0 as n union all select 1 as n union all select 2) n
        where n.n not in (select d2.draft from draft d2)
        order by rand()
        limit 1
       ) n
    set d.random_number = n.n
    where d.lobby = 1
    limit 1;

Обратите внимание на limit 1. Это позволяет обновлять по одной строке за раз. Если несколько строк удовлетворяют условию, необходимо повторить update с соответствующими критериями фильтрации.

0 голосов
/ 04 ноября 2019

В вашем запросе вы, вероятно, думаете, что это:

WHERE "random_num" NOT IN...

сравнивает столбец random_num со значениями после IN, но это не так. Почему? Поскольку вычисляемый столбец, такой как random_num, не может использоваться в предложении WHEREОн сравнивает строку "random_num", которая преобразуется в 0, чтобы выполнить сравнение. Это будет работать, если id s (как и ваши данные выборки) 3 последовательных целых числа:

update draft d cross join (
  select group_concat(t.x order by rand() separator '') col
  from (select 0 x union all select 1 union all select 2) t
) r
set d.draft = substr(r.col, d.id % 3 + 1, 1)
where d.lobby = 1;

Столбец draft будет обновлен тремя уникальными случайными целыми числами в диапазоне 0-2. Смотрите демо .

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