从表中选择一个随机行

时间:2015-03-11 16:01:23

标签: mysql select random

我有两个表叫做主题,如下图所示!
topic_id TOPIC_NAME
1主题1
2主题2
3主题3

和另一个名为问题的表格如图所示
q_id question_name topic_id
1个问题1 1 2问题2 1 3问题3 1
4问题4 2
5问题5 2
6问题6 2
7问题7 3
8问题8 3
9问题9 3
 

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

4 个答案:

答案 0 :(得分:2)

可以sort the rows randomly and then fetch the top row from this random order

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

SELECT * FROM questions 
ORDER BY RAND() 
LIMIT 2

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

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

SELECT topic_id FROM topics 
ORDER BY RAND() 
LIMIT 2

然后用这些主题id选择2个随机问题(2个选择语句)

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

为每个topic_id重复选择。

据推测,这些选择语句可以组合成一个大的选择语句,但我现在还不确定。

<{3}}中指出

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

答案 1 :(得分:2)

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

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 :(得分:1)

您可以在查询中使用ORDER BY RAND()LIMIT 2,但对于包含数千条记录或更多记录的表格,运行速度会非常慢。

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

这些方面的东西:

$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

答案 3 :(得分:0)

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

select q.question_name from topics t, questions q where t.topic_id = q.topic_id and t.topic_id in (1, 2, 3) /*define your 3 given topics*/ order by rand() limit 0,2;