【问题标题】:How can I select 2 different random rows from a table?如何从表中选择 2 个不同的随机行?
【发布时间】:2013-10-30 17:01:30
【问题描述】:

我现在有

row=session.query(Item).order_by(func.random()).limit(2)
name1=row[0].name
name2=row[1].name

这给了我每个条目的第一列(名称)。问题是,我得到了倍数(它会选择相同的随机行两次。我希望它总是不同的。有没有办法在没有 if, then 语句的情况下做到这一点?

如果它有用,当我打印行时,它会给我这样的东西:

SELECT items.id AS items_id, items.name AS items_name, items.data AS items_data FROM items ORDER BY random() LIMIT ? OFFSET ?

为什么会说 limit ?我已经输入了limit(2)

【问题讨论】:

  • 当你说 LIMIT 2 时你会收到错误吗?
  • 嗯,我不确定。我会在哪里专门定义 LIMIT 2。我以为我是通过我的视图代码来定义的,查询结束时有 limit(2)
  • 检查我发布的解决方案..

标签: python sql sqlite sqlalchemy pyramid


【解决方案1】:

似乎在 func.random() 上使用 order_by 在 SQL 中是个坏主意 (http://www.webtrenches.com/post.cfm/avoid-rand-in-mysql)。相反,我计算了表格的长度,找到了这个长度的 2 个随机数,然后查询表格以找到与这些随机数关联的行。显然这更快。至少它没有任何重复:)

number=session.query(func.count(Item.id)).scalar()
randoms=random.sample(range(number),2)
item1=session.query(Item).filter_by(id=randoms[0]+1).one()
item2=session.query(Item).filter_by(id=randoms[1]+1).one()

【讨论】:

    【解决方案2】:
    SELECT items.id AS items_id, items.name AS items_name, items.data AS items_data
    FROM items
    ORDER BY random()
    LIMIT 2;
    

    查看以下链接以供参考。

    http://www.tutorialspoint.com/sqlite/sqlite_limit_clause.htm

    【讨论】:

    • 所以你是说 .limit(2) 部分不起作用,这就是为什么它两次选择同一个条目?
    • 但即使限制不起作用,它也会返回整个表。为什么会有重复的条目?
    • 如果你需要任意两条随机记录,为什么不使用 WHERE ROWNUM
    • 我在 ROWNUM 上找不到太多信息。似乎是特定于 oracle 数据库的?
    • @SOaddict ROWNUM 在 sqlite 中不存在。你必须使用限制。不使用 random(),输出很可能相当稳定...
    猜你喜欢
    • 1970-01-01
    • 2022-01-26
    • 2016-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多