如何在 MySql 中排除某些记录


How can I exclude some records in MySql

这是我的问题...抱歉,如果对某些用户来说太简单了,我是新手。

我有三个数据库表,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 方法。 两者都应该做得很好,但可能需要一列来达到这个"随机"目的。