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

Limit specific WHERE clauses in a SQL statement (MySQL)?

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

我正在努力完成以下任务:

我有以下查询(我正在使用 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 class 构建 clean 准备语句,因为我需要三个独特的参数标记 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().

  1. 我将重复查询的大部分内容。事实上,我需要添加其他几个 WHERE 子句,这些子句对于所需的所有难度级别都是相同的。

我的问题是,如何在不重复自己的情况下构建查询,以便我可以使用 PDO class。我只需要 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();
}