【问题标题】:Select from multiple tables to obtain a single random row从多个表中选择以获得单个随机行
【发布时间】:2014-08-13 19:47:36
【问题描述】:

我有这个查询通过我最初的people 表并选择一个随机行:

SELECT * FROM people ORDER BY RAND() LIMIT 0,1

问题是,我的系统发生了一些变化,我目前需要对多个表(目前是两个)执行此查询...但仍然获得相同的结果:单个随机行。

我自然想尝试以下方法,但我读到它最终会成为笛卡尔积:

SELECT * FROM people, products ORDER BY RAND() LIMIT 0,1

我想我可以通过使用UNION 来解决我的问题,但不知道如何解决。

我还必须明确 peopleproducts 具有完全相同的结构(3 个字段):

  • 身份证
  • 姓名
  • 说明

知道我该如何做这个查询吗?一些关于优化它的建议也很棒。

感谢您的帮助。

【问题讨论】:

  • 人和产品的字段数相同吗?
  • 确实如此,感谢您指出这一点,我会将其添加到说明中。

标签: mysql select union


【解决方案1】:

使用联合?

SELECT * FROM (
    SELECT * FROM people ORDER BY RAND() LIMIT 0,1
    UNION ALL
    SELECT * FROM products ORDER BY RAND() LIMIT 0,1
) AS foo ORDER BY RAND() LIMIT 0,1

从每个表中随机抽取一行,然后随机选择其中一行作为最终结果。当然,这假定两个表具有相同的字段/结构。你可能需要做一些技巧,比如

   SELECT 'people' as source_table, id FROM people ...
   UNION
   SELECT 'products', id FROM products

【讨论】:

  • 不允许在联合查询中使用多个限制,除非每个带有限制的查询都包含在 () 中,例如 (query limit) union (query limit)
  • 谢谢!不过我有一个问题,为什么在这种特殊情况下使用“AS foo”?
  • 从子查询派生的表必须有一个别名。
  • 我明白了,谢谢你的帮助。我尝试立即将此请求与 PDO 一起使用,它产生了一个错误(UNION 和 ORDER BY 的使用不正确)。我在 UNION ALL 前后的查询周围添加了一些括号,效果很好。
  • 我现在想知道,是否有一种简单的方法可以使此请求排除先前选择的行?为了防止同一行最终出现两次。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-25
  • 1970-01-01
  • 2016-06-17
  • 2015-04-17
  • 1970-01-01
相关资源
最近更新 更多