0

我正在尝试使用从另一个表中获取的随机字符串(名称)替换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 中通过两个不同的数据库查询来完成。

提前致谢!

4

1 回答 1

1

似乎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
于 2019-04-18T16:01:22.403 回答