【问题标题】:MySql : Get two random rows with different valueMySql:获取两个具有不同值的随机行
【发布时间】:2018-09-25 11:06:09
【问题描述】:

我有这张桌子:

我想在发布的条件下获得 2 个随机行并具有不同的位置值(例如:如果第一行是垂直的,则第二行必须是水平的)。

我试过了

  SELECT * FROM publicity where published = 1 and location = 'vertical' 
   UNION 
  SELECT * FROM publicity where published = 1 and location = 'horizontal'
   ORDER BY rand() LIMIT 2

它有时会给我 2 行具有相同位置值的信息。

【问题讨论】:

  • 欢迎您! Stack Overflow不是代码编写服务。我们总是乐于帮助和支持新的编码员,但您需要先帮助自己。您应该尝试自己编写代码。请阅读How to create a Minimal, Complete, and Verifiable example
  • 用 UNION 组合两个查询,为每个位置随机选择一个 ...
  • “使用 UNION 组合两个查询,为每个位置随机选择一个” @misorude 确实可以使用 union 和 where 过滤器。
  • 我把这个:SELECT * FROM publicity where published = 1 and location = 'vertical' UNION SELECT * FROM publicity where published = 1 and location = 'horizo​​ntal' ORDER BY rand() LIMIT 2 有时给我 2 行具有相同位置值
  • 您需要将限制应用于单个查询(以及订单)。现在,您正在读取所有条记录,随机排序,然后将结果限制为两条。

标签: php mysql random phpmyadmin


【解决方案1】:

您的要求需要来自两组不同物品的随机物品。一个你叫horizontal,另一个叫vertical。所以,你必须得到这两个随机物品,然后取它们的并集。

SELECT * FROM (SELECT whatever FROM table WHERE location='horiz' ORDER BY RAND() LIMIT 1) h
UNION ALL
SELECT * FROM (SELECT whatever FROM table WHERE location='vert' ORDER BY RAND() LIMIT 1) v

如果您将ORDER BY RAND() LIMIT 1 操作应用于整个结果集,您可能会从一个位置获得两项。

这两个查询被包裹在 SELECT * FROM (SELECT ... ) a 中,因为 MySQL 想要在合并后应用 ORDERLIMIT 子句..

为什么是UNION ALL?因为UNION 对其结果集进行了重复数据删除,而您不需要这样做。

专业提示ORDER BY RAND() LIMIT 1 可以正常工作,但速度非常慢,尤其是在大桌子上。

【讨论】:

    猜你喜欢
    • 2011-09-26
    • 2014-02-18
    • 1970-01-01
    • 2011-01-20
    • 2022-11-21
    • 2011-09-20
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    相关资源
    最近更新 更多