【问题标题】:MySQL - Generate rows based on results only when neededMySQL - 仅在需要时根据结果生成行
【发布时间】:2013-11-23 21:20:11
【问题描述】:

我在 MySQL 上创建了一个视图,它会产生如下随机结果:

SELECT word1, word2, word3 FROM view_name ORDER BY rand() LIMIT 50

word1 | word2 | word3 |
------+-------+-------+
foo2  | bar2  | baz2  |
foo1  | bar1  | baz1  |
foo3  | bar3  | baz3  |

我需要找到一种方法,从这 3 行中随机创建另外 47 行以达到“限制”。

查询也将应用于类似的视图(超过 50 行),但在这种情况下,我仍然需要将限制设置为 50 max(忽略重复过程并从选择中返回行)。

有可能吗?我该怎么办?

更新 对不起,我会尽力解释得更好。我有这种情况:

  • 我正在使用相同类型的查询生成一些视图,但 WHERE 子句不同。
  • 结果具有相同的列。不同之处在于返回的行数。
  • 有些视图返回超过 50 行,有些则返回更少。
  • 目标是准确返回 50 行。如果视图返回少于 50,我需要生成剩余的行。如果视图返回超过 50 行,它将只返回 50。

    例如:

  • View1 返回 3 行。我需要生成 47 行才能返回 50 行。
  • View2 返回 55 行。我不需要生成行,只想限制为 50 行。
  • View3 返回 25 行。我需要生成 25 行...

【问题讨论】:

    标签: mysql random rows


    【解决方案1】:

    你可以试试这样的:

    SELECT final.tempval1, final.tempval2, final.tempval3
    FROM (
      SELECT temptable1.tempval4 AS tempval1, temptable5.word2 AS tempval2, temptable6.word3 AS tempval3
      FROM (
        SELECT temptable2.word1 AS tempval4, temptable2.word2 AS tempval5, temptable2.word3 AS tempval6
        FROM view_name temptable2
        LEFT JOIN view_name temptable3 ON temptable2.word1 = temptable3.word1
        LEFT JOIN view_name temptable4 ON temptable3.word2 = temptable4.word2 ORDER BY RAND() LIMIT 50 offset 3
      ) temptable1    
      LEFT JOIN view_name temptable5 ON temptable1.tempval4 = temptable5.word1
      LEFT JOIN view_name temptable6 ON temptable5.word2 = temptable6.word2
      LIMIT 0, 50
    ) final
    ORDER BY RAND() LIMIT 50
    

    我花了一段时间才弄清楚你在寻找什么,但我仍然不确定我是否理解正确,所以如果它不起作用,请随时告诉我。

    【讨论】:

    • 我试过你的代码,它正在生成 47 行。我已经删除了偏移量并将 RAND() 更改为“最终”表,它现在正在工作,但我需要使用其他视图进行测试。谢谢!我可以编辑您的帖子并将其设置为答案吗?不知道这在stackoverflow上是如何工作的......
    • 哦,好的...我以为您只想要 47:I need to find a way to randomly create, from these 3 rows, another 47 rows to reach the "limit". OOPS 好的,我刚刚阅读了您的更新...无论如何,如果系统允许您编辑答案,请随意。不过,我现在会对其进行编辑,因此,如果我误解了您所做的更改,请告诉我。 :)
    猜你喜欢
    • 1970-01-01
    • 2012-11-29
    • 1970-01-01
    • 2013-01-06
    • 2022-01-20
    • 2021-08-18
    • 1970-01-01
    • 1970-01-01
    • 2014-04-28
    相关资源
    最近更新 更多