4

我有一个使用 web.py 在 Python 中做的小项目。它是一个名称生成器,使用名称 ( firstname, middlename, anothername, surname) 的 4 个“部分”。名称的每一部分都是 MySQL 数据库中的实体集合(name_part (id, part, type_id)name_part_type (id, description))。基本的东西,我猜。

我的生成器随机选择每个“类型”的条目,并组合一个滑稽的名字。现在,我select * from name_part where type_id=[something] order by rand() limit 1用来选择每种类型的随机条目(所以我也有 4 个查询运行每个网页浏览,我认为这比一个可能返回数百行的胖查询要好;如果您对如何拉这在一个查询中关闭,我会听 oa sproc)。

显然我想让这更随机。实际上,我想给它更好的覆盖范围,而不一定是随机性。我想确保它使用尽可能多的可能性。这就是我在这个问题中要问的问题,我可以使用什么样的策略来覆盖大量随机样本

我的想法是在每个 上实现一个计数器列name_part,并在每次使用时递增它。我需要一些逻辑然后说:“获取一个小于此“name_part_type”的最高“计数器”的name_part,除非没有然后随机选择一个”。我不太擅长SQL,这种逻辑可能吗?我能想到的唯一方法是名称的每个部分最多需要 3 或 4 个查询(因此每个网页浏览最多 12 个查询)。

我可以在这里得到一些关于我的逻辑的输入吗?我是不是想多了?这实际上听起来很适合存储过程......但是你们至少可以帮我解决如何在没有存储过程的情况下做到这一点吗?(我不知道我是否可以将存储过程与 web.py 的内置数据库一起使用)。

我希望这不是非常愚蠢,但提前感谢。

编辑:除了我的具体问题之外,我仍然很好奇是否有任何我可以使用的替代策略可能会更好。

4

2 回答 2

4

我想你追求的是:

select * from name_part
    where type_id=[something]
    order by used_count asc, rand()
    limit 1

这会将较少使用的名称放在列表的顶部,如果有多个具有相同(最低)used_count 的名称,它们将随机排序。

于 2009-02-05T04:57:45.563 回答
1

我同意您的直觉,即使用存储过程是正确的方法,但是,我几乎总是尝试在数据库中实现数据库的东西。

在你的过程中,我会引入某种逻辑,比如说,只有 30% 的机会返回结果实际上会增加计数器。只是为了增加可变性。

于 2009-02-05T05:05:00.603 回答