让我首先说,我编写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道题,我将主要有代数题,一些历史题,没有科学题。我希望每个被选中的科目都有平等的代表性。
我想我可能在这个项目上吃得太多了。
只是猜测:
$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";
@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的调谐系数可能会给科学带来更好的机会。