0

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

我有三个数据库表,People (idPerson)、Question (idQuestion,Answer)、AskedQuestions (idPerson,idQuestion)。当我向用户提问时,我会在 AskedQuestions 中添加一行,这样我就可以获得注册表。

我遇到的问题是我必须选择一个随机问题,以前没有向指定用户询问过这个问题。

我已经阅读了几个小时以了解选择随机行的最佳方法,以及如何进行查询以仅选择被询问的行,但还没有想出如何混合它们。

任何人都知道我该怎么做,在PHP 和 MySql中?我会非常感谢它。提前感谢社区,对不起我的英语,我的英语技能不是最好的!

问候

编辑

我试图投票给你们所有人,但是直到我有rep15,啊哈哈......我忘了提到一件事,因为我正在阅读,使用 RAND() 对表格进行全面扫描,这在我的案例是不可接受的,因为表格是关于 500000 条记录的相当大的问题,而 AskedQuestions 是关于 1500000 甚至更多的问题......所以执行 RAND 的时间太慢了......

我需要类似...加入问题和提出的问题,并排除 idUser 等于会话用户和 idQuestion == idAskedQuestion 的问题...并从那里随机选择一个?

有没有办法做到这一点,在这种情况下,它会非常慢?

4

7 回答 7

2
$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";

它将选择不同的问题

于 2012-05-18T06:58:41.870 回答
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
于 2012-05-18T06:57:42.273 回答
0

您是否已经尝试过ORDER BY RAND()选择随机行并NOT IN仅匹配未提出的问题?就像是:

选择 q.idQuestion
来自问题 q
WHERE q.idQuestion 不在(从 AskedQuestions aq 中选择 aq.idQuestion,其中 aq.idPerson = 1)
兰德订购()

显然,将 1 替换为适当的值(可能是 PHP 变量)。

于 2012-05-18T06:59:02.937 回答
0

尝试:

SELECT * FROM Question, AskedQuestions WHERE AskedQuestions.idQuestion != Question.idQuestion AND AskedQuestions.idPerson = 'PERSON_ID' LIMIT 1
于 2012-05-18T07:01:18.043 回答
0

尝试下面给出的查询

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 "); 

我希望它对你有帮助。

谢谢

谢谢

于 2012-05-18T07:04:58.153 回答
0

到目前为止你做了什么?

你可以试试这个:

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;
于 2012-05-18T07:06:17.003 回答
0

我对如何有效地选择随机行进行了调查。结果在这里

对于您的情况,您有AUTO_INCREMENT? 如果是这样,那么看看“Case: AUTO_INCREMENT with gaps, 1 row returned”是否能满足您的需求。请注意,WHERE过滤掉不需要的问题的子句会导致“空白”。

如果不是,则考虑 FLOAT 或 UUID 方法。两者都应该做得很好,但可能需要一个用于此“随机”目的的列。

于 2016-08-05T20:13:34.560 回答