【问题标题】:php mysql return variable amountsphp mysql 返回可变金额
【发布时间】:2015-04-23 12:21:24
【问题描述】:

首先让我说我将 php 编码为一种爱好,但并不了解很多。也就是说,我很难想出一个聪明的方法来执行特定类型的查询。

假设我有一个动态测验应用程序,它使用三个不同科目的试题数据库; 200 代数,100 历史,50 科学。用户可以选择他们希望在他们的测验中有哪些科目和多少个科目,还可以选择测验中有多少个问题。

下面是我现在正在使用的工作代码...

$sql = "SELECT *
        FROM quiz
        WHERE keyword LIKE '$algebra'
        OR keyword LIKE '$history'
        OR keyword LIKE '$science'        
        ORDER BY RAND() LIMIT $amount";

但是,此代码的唯一问题是,如果我在测试中选择 10 个问题,我将主要有代数问题、一些历史问题而没有科学问题。我希望这样选择的每个主题都能得到平等的代表。

我想我可能在这个项目中咬得比我能咀嚼的更多。

【问题讨论】:

    标签: php mysql sql random


    【解决方案1】:

    只是猜测:

    $equal = $amount/3; // do your best to round this...
    $sql = "SELECT * FROM quiz WHERE keyword LIKE '$algebra' ORDER BY RAND() LIMIT $equal
    UNION
    SELECT * FROM quiz WHERE keyword LIKE '$history' ORDER BY RAND() LIMIT $equal
    UNION
    SELECT * FROM quiz WHERE keyword LIKE '$science' ORDER BY RAND() LIMIT $equal";
    

    【讨论】:

    • 这仅在选择的问题数少于 150 时有效。如果用户选择的问题超过 150 个,则此查询将不会返回预期的结果数,因为只有 50 个科学问题。
    • 要检索的最大数量是另一个问题,您可以在 sql 查询之前通过其他方式管理,例如知道哪个关键字的记录较少,然后根据此计算要检索的数量
    【解决方案2】:

    @poozolax 为您提供了精确的解决方案。 你可以让另一个尝试通过执行以下操作来补偿分配:

    $sql = "SELECT * FROM
            (SELECT *,
            case 
                 when keyword like '$algebra' then 350/200
                 when keyword like '$history' then 350/100
                 when keyword like '$science' then 350/50
            end * RAND() as ORD
            FROM quiz
            WHERE keyword LIKE '$algebra'
            OR keyword LIKE '$history'
            OR keyword LIKE '$science'        
            ) AS X ORDER BY ORD DESC LIMIT $amount";
    

    我不知道默认 RAND() 是否提供了最好的均匀分布,但是 350/50 的调整系数可能会给科学带来更好的机会。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-10
      • 2017-07-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多