2012-04-17 87 views
1

我正在尝试编写一个将返回问题及其相应答案的sql语句。在下面的例子中,我对subject_id进行了硬编码,但它会动态设置。受组数据限制

我想限制结果只有5个问题,但如果我只是添加LIMIT 5它将整个数据限制为只返回5,这不是我想要的。

SELECT q.id,q.question,a.question_id,a.answer, a.correct 
FROM questions q 
JOIN answers a ON q.id = a.question_id 
WHERE q.subject_id = 18 
GROUP BY q.id,a.id 

我也想达到别的东西,但我不知道是否会更好地实现它的商业逻辑(PHP)。我想为每个问题(acorrect = 1)加上一个随机的3个不正确的答案(correct = 0)返回正确的答案。

回答

2

对于第一个问题:您需要分别在子查询中将LIMIT应用于问题表。

SELECT q.id,q.question,a.question_id,a.answer, a.correct 
    FROM (SELECT * FROM questions q WHERE q.subject_id = 18 
      ORDER BY RAND() LIMIT 5) q 
    JOIN answers a on q.id = a.question_id 
GROUP BY q.id, a.id 
+0

感谢您的快速响应。该解决方案工作正常,除了它总是返回相同的5个问题(前5个)。我需要每次都返回随机的。从阅读RAND函数来看,这将是一个相当缓慢的解决方案,因为数据库将有超过10K个问题。是否有更有效的解决方案可以限制问题并每次返回随机问题? – SteveF 2012-04-17 01:07:31

+0

也许这个程序化的解决方案会更好。你怎么看? http://www.electrictoolbox.com/msyql-alternative-order-by-rand/ – SteveF 2012-04-17 01:12:14

+0

10k不是很多行(尤其是因为您将首先通过'subject_id'进行过滤)。你可能想尝试一下,看看它真的有多慢。如果你想真正快速的随机化,你可以用这样的解决方案生成随机ID的客户端:http://www.dasprids.de/blog/2008/06/07/fetching-random-rows-of-mysql-有效率的。也请看看这里:http://stackoverflow.com/questions/2707717/how-do-i-select-a-random-record-efficiently-in-mysql – mellamokb 2012-04-17 01:12:56