簡體   English   中英

從表中選擇一個隨機行

[英]select a random rows from table

我有兩個表,一個叫做主題,如下所示!
topic_id topic_name
1個主題1
2主題2
3主題3

另一個表稱為問題,如圖所示
q_id問題名稱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個問題。 有人請幫助我解決此問題

可以對行進行隨機排序,然后從此隨機順序中獲取第一行

對於可能具有相同主題的兩個隨機問題:

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

然后選擇2個帶有這些主題ID的隨機問題(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重復選擇。

大概這些選擇語句可以合並為一個大的選擇語句,但是我不確定這一點。

請注意,正如在另一個答案中指出的那樣,這可能效率較低(在純sql中隨機選擇),更好的解決方案是在PHP(或任何平台)中預先計算隨機索引, 然后實際選擇隨機問題。 由於問題中未提及任何語言,因此我將其保留在此處(並指向該方法的其他答案)

獲取具有其問題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

您可以在查詢中使用ORDER BY RAND()LIMIT 2 ,但對於具有數千條或更多記錄的表,它的運行速度非常慢。

對於大表,一種更好的方法是使用所需的WHERE條件獲取PK字段的邊界值,在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上的q_id以及WHERE子句中使用的列。

我希望q_id是表的PK ,這意味着它已經是UNIQUE INDEX

提供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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM