我有两个表,一个叫做主题,如下所示!
topic_id topic_name
(1)商业、金融、金融等领域。
2
第三章主要目的
还有另一张名为“问题”的表格,如下所示
q_id question_name topic_id
1
2
3.商业、金融、商业、金融、金融、商业、金融、金融等行业的商业、金融等行业的发展。
4.商业、商业、金融等领域的商业、金融、金融等领域的商业、金融等领域的商业、金融、金融等行业。
5
6
7
8
9
我想从三个主题中随机选择两个问题。谁来帮我解决这个问题?
发布于 2015-03-11 16:18:16
获取带有问题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
发布于 2015-03-11 16:10:43
一个可以对行进行随机排序,然后从这个随机顺序获取最上面的行。
对于两个可以有相同主题的随机问题,
SELECT * FROM questions
ORDER BY RAND()
LIMIT 2
对于两个应该具有不同主题的随机问题,:使用两个不同的查询,这些查询以两个不同的topic_ids (t1,t2)为参数:
首先选择2个随机主题ids (类似于上面的代码):
SELECT topic_id FROM topics
ORDER BY RAND()
LIMIT 2
然后选择两个带有这些主题ids的随机问题(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
对每个topic_id重复选择。
想必这些select语句可以合并成一个大select语句,但我现在还不确定。
Note在另一个答案中指出,这可能效率较低(在纯另一个答案中随机选择),更好的解决方案是预先计算PHP中的随机索引(或您的平台是什么),而则实际选择随机问题。由于问题中没有提到任何语言,我将把它留在这里(并指出这个方法的另一个答案)。
发布于 2015-03-11 16:39:24
您可以在查询中使用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
了。
https://stackoverflow.com/questions/28991552
复制相似问题