无法使用从sqlite中的另一个表中获取的多个随机字符串替换字符串

无法使用从sqlite中的另一个表中获取的多个随机字符串替换字符串,sqlite,Sqlite,我试图用一个随机字符串替换10条随机记录中的占位符字符串,该字符串的名称取自另一个表,只使用sqlite语句 为了用子查询的结果替换占位符,我做了一个子查询。我认为每个子查询都从names表中加载了一个随机名称,但我发现情况并非如此,每个占位符都被替换为相同的字符串 select id, (replace (snippet, "%NAME%", (select name from names where gender = "male" ) ) ) as snippet from image

我试图用一个随机字符串替换10条随机记录中的占位符字符串,该字符串的名称取自另一个表,只使用sqlite语句

为了用子查询的结果替换占位符,我做了一个子查询。我认为每个子查询都从names表中加载了一个随机名称,但我发现情况并非如此,每个占位符都被替换为相同的字符串

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中通过两个不同的数据库查询来完成

提前谢谢

子查询中的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

我仍然有同样的问题需要澄清:如果我从imagedata表中请求一行,那么每个请求都会得到适当的替换。否则,如果我一次请求10行,所有行都会从名称表中得到相同的替换。@GarethJax问题是该子查询只计算一次,因为它不依赖于主查询的当前行的值。是的,我现在正在检查它。我将尝试找到一个解决方法。我仍然有相同的问题,即使是查询的最新版本@对于它的工作原理和一个漂亮的代码,现在你能给我解释一下它是如何工作的吗