Невозможно заменить строку несколькими случайными строками, взятыми из другой таблицы в sqlite - PullRequest
0 голосов
/ 18 апреля 2019

Я пытаюсь заменить строку-заполнитель внутри выделения 10 случайных записей на случайную строку (имя), взятую из другой таблицы, используя только операторы sqlite.

Я выполнил подзапрос, чтобы заменить () заполнителя на результаты подзапроса.Я думал, что каждый подзапрос загружает случайное имя из таблицы имен, но я обнаружил, что это не тот случай, и каждый заполнитель заменяется на одну и ту же строку.

select id, (replace (snippet, "%NAME%", (select 
name from names 
where gender = "male"
) )
) as snippet 
from imagedata
where timestamp is not NULL
order by random()
limit 10

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

  • привет, я% NAME%, а это мой дом
  • Это машина% NAME%, дайте мне знать, что вы думаете

вместо этого каждый ряд имеет один и тот же вид замены:

  • привет, я Дэвид и это мой дом
  • Это машина Дэвид , дайте мне знать, что вы думаете
  • и так далее ...

Я не уверен, что это можно сделать внутри sqlite или если мне придется это сделатьв PHP более двух разных запросов к базе данных.

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

1 Ответ

1 голос
/ 18 апреля 2019

Кажется, что random() в подзапросе оценивается только один раз.Попробуйте это:

select 
  i.id,
  replace(i.snippet, '%NAME%', n.name) snippet
from (
  select 
    id, 
    snippet, 
    abs(random()) % (select count(*) from names where gender = 'male') + 1 num 
  from imagedata 
  where timestamp is not NULL
  order by random() limit 10
) i inner join (
  select 
    n.name,
    (select count(*) from names where name < n.name and gender = 'male') + 1 num 
  from names n  
  where gender = 'male'
) n on n.num = i.num
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...