![](/img/trans.png)
[英]How can i exclude some records from an mysql query based on another query
[英]How can I exclude some records in MySql
这是我的问题...对不起,如果对于某些用户来说太简单了,我是新手。
我有三个数据库表, 人员 (idPerson), 问题 (idQuestion,Answer), 问问题 (idPerson,idQuestion)。 当我向用户提问时,我在AskedQuestions中添加了一行,以便可以注册。
我的问题是我必须选择一个随机问题,该问题之前没有向指定用户询问过。
我已经阅读了好几个小时,以获取选择随机行的最佳方法,以及如何进行查询以仅选择被询问的行,但是还没有弄清楚如何混合它们。
任何人都知道如何在PHP和MySql中做到这一点? 我会非常感激的。 提前感谢社区,并为我的英语感到抱歉,我的英语水平不是最好的!
问候
编辑
我试图将所有人都投赞成票,但是直到我有rep15票时,我才能这样做……我忘了提及一件事,因为我在阅读时使用RAND()对表进行了全面扫描,这在我情况是不可接受的,因为表是很大的问题,关于500000条记录的问题和AskedQuestions关于1500000甚至更多的问题...因此执行RAND的时间太慢了...
我需要类似的东西...加入问题和询问的问题,并排除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
仅匹配不问的问题? 就像是:
SELECT q.idQuestion FROM Question q WHERE q.idQuestion NOT IN (SELECT aq.idQuestion FROM AskedQuestions aq WHERE aq.idPerson = 1) ORDER BY RAND()
显然,将1替换为适当的值(可能是PHP变量)。
尝试:
SELECT * FROM Question, AskedQuestions WHERE AskedQuestions.idQuestion != Question.idQuestion AND AskedQuestions.idPerson = 'PERSON_ID' 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 ");
希望对您有帮助。
谢谢
谢谢
到目前为止你做了什么?
您可以尝试以下方法:
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;
我对如何有效地随机选择行进行了调查。 结果在这里 。
对于您的情况,您有AUTO_INCREMENT
吗? 如果是这样,则查看“情况:带有间隙的AUTO_INCREMENT,返回1行”是否可以满足您的需求。 注意, WHERE
子句过滤掉不需要的问题会导致“空白”。
如果不是,则考虑FLOAT或UUID方法。 两种方法都应该做的不错,但可能需要为此目的使用一列。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.