首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从表中选择随机行

从表中选择随机行
EN

Stack Overflow用户
提问于 2015-03-11 16:01:23
回答 4查看 90关注 0票数 2

我有两个表,一个叫做主题,如下所示!

topic_id   topic_name

(1)商业、金融、金融等领域。

2

第三章主要目的

还有另一张名为“问题”的表格,如下所示

q_id   question_name   topic_id

1

2

3.商业、金融、商业、金融、金融、商业、金融、金融等行业的商业、金融等行业的发展。

4.商业、商业、金融等领域的商业、金融、金融等领域的商业、金融等领域的商业、金融、金融等行业。

5

6

7

8

9

我想从三个主题中随机选择两个问题。谁来帮我解决这个问题?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-03-11 16:18:16

获取带有问题ID GROUP_CONCAT([column] order by RAND())的主题列表。然后将表链接到自身。

代码语言:javascript
运行
复制
SELECT t.q_id, t.question_name, t.topic_id
FROM table t
JOIN (
    SELECT topic_id, SUBSTRING_INDEX(GROUP_CONCAT(q_id ORDER BY RAND()), ',', 2) as qList
    FROM table GROUP BY topic_id
) tGrouped ON FIND_IN_SET(t.q_id, tGrouped.qList)>0
票数 2
EN

Stack Overflow用户

发布于 2015-03-11 16:10:43

一个可以对行进行随机排序,然后从这个随机顺序获取最上面的行。

对于两个可以有相同主题的随机问题,

代码语言:javascript
运行
复制
SELECT * FROM questions 
ORDER BY RAND() 
LIMIT 2

对于两个应该具有不同主题的随机问题,:使用两个不同的查询,这些查询以两个不同的topic_ids (t1,t2)为参数:

首先选择2个随机主题ids (类似于上面的代码):

代码语言:javascript
运行
复制
SELECT topic_id FROM topics 
ORDER BY RAND() 
LIMIT 2

然后选择两个带有这些主题ids的随机问题(2个select语句)

代码语言:javascript
运行
复制
SELECT * FROM questions 
WHERE topic_id = t1
ORDER BY RAND() 
LIMIT 1

SELECT * FROM questions 
WHERE topic_id = t2
ORDER BY RAND() 
LIMIT 1

更新(在OP的评论和解释之后)

要从每个主题中获得两个随机问题,请使用上述解决方案的一个变体:

3次选择发言(每个专题一次):

代码语言:javascript
运行
复制
SELECT * FROM questions 
WHERE topic_id = needed_topic_id_here
ORDER BY RAND() 
LIMIT 2

对每个topic_id重复选择。

想必这些select语句可以合并成一个大select语句,但我现在还不确定。

Note另一个答案中指出,这可能效率较低(在纯另一个答案中随机选择),更好的解决方案是预先计算PHP中的随机索引(或您的平台是什么),而则实际选择随机问题。由于问题中没有提到任何语言,我将把它留在这里(并指出这个方法的另一个答案)。

票数 2
EN

Stack Overflow用户

发布于 2015-03-11 16:39:24

您可以在查询中使用ORDER BY RAND()LIMIT 2,但是对于有上千条或更多记录的表,它运行得非常慢。

大表的一种更好的方法是使用所需的PK条件获取WHERE字段的边界值,在PHP中的这些边界值之间生成2个较小的随机数,然后发出2个MySQL查询以得到2个问题。

类似于这样的东西:

代码语言:javascript
运行
复制
$query = '
    SELECT MIN(q_id) AS min_id, MAX(q_id) AS max_id
    FROM questions
    WHERE topic_id = 1        # put the filtering you need here
';
// Run the query
// ... use your regular PHP code for database access here ...
// get and store the returned values in PHP variables $minId and $maxId


// Keep the generated random values here to avoid duplicates
$list = array();

// Get N random questions from the database
for ($cnt = 0; $cnt < N; $cnt ++) {
    // Generate a new ID that is not in the list
    do {
        $id = rand($minId, $maxId);
    } while (in_array($id, $list);

    // Put it into the list to avoid generating it again
    $list[] = $id;

    // Get the random question
    $query = "
        SELECT *
        FROM questions
        WHERE topic_id = 1
          AND q_id <= $id
        ORDER BY q_id DESC
        LIMIT 1
    ";
    // Run the query, get the question
    // ... use your regular PHP code for database access here ...
}

无论您运行什么查询(这些查询或其他查询由其他答案提供),都需要q_id上的索引和WHERE子句中使用的列。

我希望q_id是表的PK,这意味着它已经是UNIQUE INDEX了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28991552

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档