繁体   English   中英

如何排除MySql中的某些记录

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM