Mysql 从表中随机选择一行

Mysql 从表中随机选择一行,mysql,select,random,Mysql,Select,Random,我有两个表,一个叫做topic,如下所示! 主题\u id主题\u名称 1专题1 方案2 方案3 另一张表格叫做问题,如图所示 问题名称主题名称 1问题11 2问题21 3问题31 4问题42 5问题52 6问题62 7问题73 8问题83 9问题93 我想从给定的三个主题中随机选择两个问题。有人能帮我解决这个问题吗 对于可能具有相同主题的两个随机问题: 对于两个应具有不同主题的随机问题: 使用两个不同的查询,将两个不同的主题ID t1、t2作为参数: 首先选择2个与上述代码类似的随机主题ID

我有两个表,一个叫做topic,如下所示! 主题\u id主题\u名称 1专题1 方案2 方案3

另一张表格叫做问题,如图所示 问题名称主题名称 1问题11 2问题21 3问题31 4问题42 5问题52 6问题62 7问题73 8问题83 9问题93

我想从给定的三个主题中随机选择两个问题。有人能帮我解决这个问题吗

对于可能具有相同主题的两个随机问题:

对于两个应具有不同主题的随机问题: 使用两个不同的查询,将两个不同的主题ID t1、t2作为参数:

首先选择2个与上述代码类似的随机主题ID:

SELECT topic_id FROM topics 
ORDER BY RAND() 
LIMIT 2
然后选择2个随机问题,主题为2个select语句

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.为每个主题选择一个陈述:

SELECT * FROM questions 
WHERE topic_id = needed_topic_id_here
ORDER BY RAND() 
LIMIT 2
对每个主题id重复选择

大概这些select语句可以组合成一个大的select语句,但我现在不确定


注意,正如中所指出的,在纯sql中随机选择可能效率较低,更好的解决方案是在PHP或任何平台中预先计算随机索引,然后实际选择随机问题。由于问题中没有提到任何语言,我将把它留在这里,并指出此方法的其他答案

提供3个主题ID以随机获得2个问题:

挑选 q、 问题(姓名) 从…起 主题t, 问题q 哪里 t、 topic\u id=q.topic\u id和 t、 1、2、3/*中的主题id定义您的3个给定主题*/
以兰特为单位的订单限制为0,2

获取主题列表及其问题ID GROUP_CONCAT[column]按兰德顺序排列。 然后将表链接到自身

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
您可以在查询中使用ORDER BY RAND和LIMIT 2,但对于具有数千条或更多记录的表,它的运行速度非常慢

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

大致如下:

$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是该表的主键,这意味着它已经是一个唯一的索引。

所以这些问题是否应该属于不同的主题?@NikosM。结果应该包含每个主题的两个问题,并且问题需要随机选择——感谢重播为什么OP应该尝试这个?请说明您所做的事情以及您为什么这样做,不仅是为了OP,也是为了SO的未来访问者。@user2399505请注意,对于大型表,这可能会更慢,因为它包括随机排序和联接表
$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 ...
}