【问题标题】:Limit with group data限制组数据
【发布时间】:2012-04-17 00:51:49
【问题描述】:

我正在尝试编写一个将返回一个问题及其所有相应答案的 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) 中实现它是否会更好。我想返回每个问题的正确答案(a.correct = 1)加上随机的 3 个错误答案(正确 = 0)。

【问题讨论】:

    标签: mysql group-by limit


    【解决方案1】:

    对于第一个问题:您需要在子查询中单独将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
    

    【讨论】:

    • 感谢您的快速回复。该解决方案工作正常,但它总是返回相同的 5 个问题(前 5 个)。我每次都需要返回随机的。从阅读 RAND 函数来看,这将是一个相当缓慢的解决方案,因为数据库将有超过 10k 的问题。有没有更有效的解决方案,既可以限制问题,又可以每次返回随机问题?
    • 或许这种程序化解决方案会更好。你怎么看? electrictoolbox.com/msyql-alternative-order-by-rand
    • 10k 行并不是很多(尤其是因为您将首先通过subject_id 进行过滤)。您可能想尝试一下,看看它到底有多慢。如果您想要真正快速的随机化,您可以使用这样的解决方案生成随机 id 的客户端:dasprids.de/blog/2008/06/07/…。也看看这里:stackoverflow.com/questions/2707717/…
    • 关于按 subject_id 过滤的要点。这将大大减少问题的数量。这个链接也很有趣。
    • 我仍然无法弄清楚我的问题的第二部分。有人有什么想法吗?谢谢
    猜你喜欢
    • 1970-01-01
    • 2022-09-27
    • 1970-01-01
    • 1970-01-01
    • 2020-10-25
    • 2017-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多