这是我的问题...抱歉,如果对某些用户来说太简单了,我是新手。
我有三个数据库表,People(idPerson(,Question(idQuestion,Answer(,AskedQuestions(idPerson,idQuestion(。 当我向用户提问时,我会向"提问问题"添加一行,以便我可以拥有注册表。
我遇到的问题是我必须选择一个随机问题,这是以前没有向指定用户提出的
。我已经阅读了几个小时,寻找选择随机行的最佳方法,以及如何分别进行查询以仅选择被问行,但还没有弄清楚如何混合它们。
有人知道我该怎么做,在PHP和MySql中?我会非常感激的。提前感谢社区,对不起我的英语,我的英语水平不是最好的!
问候
编辑
我试图投票给你们所有人,但我不能,直到我有 rep15,啊哈哈......我忘了做一件事,当我阅读时,使用 RAND(( 对表格进行全面扫描,这在我的情况下是不可接受的,因为这些表格很大 关于 500000 条记录的问题和关于 1500000 条甚至更多的问题......所以做兰德的时间太慢了......
我需要类似的东西...加入问题和提问,并排除那些 idUser 等于会话用户和 idQuestion == idAskedQuestion...并从那里随机选择一个?
有没有办法做到这一点,在这种情况下,它会非常慢??
$res=mysql_query("select count(*) as number from question where idquestion not
in(select idquestion from askedquestion where idperson='".$_session['id']."')");
$row=mysql_fetch_assoc($res);
$num=$row['number'];
//$num has no. of rows
$final_query="select * from question where idquestion
not in(select idquestion from askedquestion
where idperson='".$_session['id']."') limit ".rand(0,$num).",1";
它将选择不同的问题
随机选择问题:
select * from question order by rand() limit 1
选择之前未问过的问题:
select * from question where idQuestion not in (select idQuestion from AskedQuestions)
组合的:
select * from question
where idQuestion not in (select idQuestion from AskedQuestions)
order by rand()
limit 1
您是否已经尝试过ORDER BY RAND()
选择随机行,并且NOT IN
只匹配未问到的问题?像这样:
选择问题从 问题 q其中 q.idQuestion 不在 (从 AskedQuestions aq 中选择 aq.idQuestion WHERE aq.idPerson = 1(按兰德((订购
显然,将 1 替换为适当的值(可能是 PHP 变量(。
尝试:
SELECT * FROM Question, AskedQuestions WHERE AskedQuestions.idQuestion != Question.idQuestion AND AskedQuestions.idPerson = 'PERSON_ID' LIMIT 1
到目前为止,你做了什么?
你可以试试这个:
SELECT * Question q LEFT JOIN AskedQuestions a ON a.idQuestion = q.idQuestion WHERE a.idQuestion is null AND a.id AND a.idperson = 2 ORDER BY RAND() LIMIT 1;
尝试下面给出的查询
SELECT * FROM `Question` AS qs WHERE qs.idQuestion not in(SELECT aq.idQuestion FROM
AskedQuestions` AS aq WHERE aq.idPerson = loggedinUserID) ORDER BY RAND() LIMIT 0,1
如果你不想在查询中使用 rand((,那么有一种方法可以。
/*Select max and min id*/
$range_result = mysql_query( " SELECT MAX(`idQuestion `) AS max_id , MIN(`idQuestion `) AS
min_id FROM `Question` ");
$range_row = mysql_fetch_object( $range_result );
$random = mt_rand( $range_row->min_id , $range_row->max_id );
$result = mysql_query( " SELECT * FROM `Question` AS qs WHERE qs.`idQuestion` >= $random
AND qs.idQuestion not in (SELECT aq.idQuestion From ASkedQuestions AS aq where
aq.idPerson = loggedInUSerID) LIMIT 0,1 ");
希望对您有所帮助。
谢谢
谢谢
我已经对如何有效地选择随机行进行了调查。 结果在这里。
对于您的情况,您有AUTO_INCREMENT
吗? 如果是这样,那么看看"案例:AUTO_INCREMENT有间隙,返回 1 行"是否满足您的需求。 请注意,过滤掉不需要的问题的WHERE
子句会导致"差距"。
如果没有,请考虑 FLOAT 或 UUID 方法。 两者都应该做得很好,但可能需要一列来达到这个"随机"目的。