mysql - 限制 SQL 语句 (MySQL) 中的特定 WHERE 子句?

标签 mysql pdo limit where-clause

我检查了类似的问题,并尝试了依靠 INJOIN 的答案,但我无法弄清楚。

我正在努力实现以下目标:

  • 允许用户选择特定的question_area
  • 允许用户在question_area内选择他或她想要的两个或多个难度级别的问题数量
  • 最后,获取关联结果

我有以下查询(我使用的是 MySQL 5.6.17):

(SELECT question FROM question_active WHERE question_area = "B" AND 
   active_difficulty = 1 ORDER BY RAND() LIMIT 4) 
UNION 
(SELECT question FROM question_active WHERE question_area = "B" AND 
   active_difficulty = 2 ORDER BY RAND() LIMIT 3) 
UNION 
(SELECT question FROM question_active WHERE question_area = "B" AND 
   active_difficulty = 3 ORDER BY RAND() LIMIT 5)

我不知道它的效率如何,但它确实有效。但是,我遇到了两种情况:

  1. 我无法使用 PHP PDO 类构建干净准备好的语句,因为我需要 question_area 的三个唯一参数标记,即使它包含相同的值。

manual 中所述:

You must include a unique parameter marker for each value you wish to pass in to the statement when you call PDOStatement::execute().

  • 我将重复查询的大部分内容。事实上,我需要添加其他几个 WHERE 子句,这些子句对于所需的所有难度级别都是相同的。
  • 我的问题是,如何在不重复自己的情况下构建查询,以便我可以使用 PDO 类。我只需要 SQL 部分的帮助,而不是 PHP。

    我天真地希望有一种方法来构建单个查询并将 LIMIT 仅应用于某些 WHERE 子句。

    我非常感谢您的帮助。谢谢!

    最佳答案

    $questions = [];
    $sql = "SELECT question FROM question_active WHERE question_area = ? 
    AND active_difficulty = ? ORDER BY RAND() LIMIT ?";
    $stmt = $pdo->prepare($sql);
    foreach ([1,2,3] as $level)
    {
        $stmt->execute([$area, $level, $limit]);
        $questions[$level] = $stmt->fetchAll();
    }
    

    关于mysql - 限制 SQL 语句 (MySQL) 中的特定 WHERE 子句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35465466/

    相关文章:

    linux - 限制每个 IP 地址每分钟的数据包

    php - 使用同一表中另一列的键更新 mysql 列

    php - 如何为树结构开发数据库模式(有向无环图)

    PHP5 MySql 和 PDO 异常

    php - 存储到数据库中 - 问题

    stored-procedures - mysql存储过程: using declared vars in a limit statement returns an error

    amazon-web-services - 亚马逊网络服务 S3 请求限制

    PHP - 从动态表单上传图像 - 文件命名问题

    没有子查询的Python mysql更新导致子查询错误

    php - 如何在一个查询中使用 PDO 进行 INSERT 和 UPDATE?