[英]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.