2012-05-18 2 views
0

여기 내 문제입니다 ... 죄송합니다. 일부 사용자에게 너무 간단하다면, 이것에 초보자입니다.어떻게 MySql의 일부 레코드를 제외 할 수 있습니까?

나는 세 DB 테이블, 사람들 (idPerson), 질문 (idQuestion, 응답), AskedQuestions (idPerson, idQuestion)가 있습니다. 사용자에게 질문을하면 AskedQuestions에 행을 추가하여 레지스트리를 가질 수 있습니다.

내가 가진 문제는 특정 사용자에게 이전에 묻지 않은 질문을 임의로 선택해야한다는 것입니다.

무작위로 행을 선택하는 가장 좋은 방법은 몇 시간이고, 요청 된 것만 선택할 수있는 쿼리를 작성하는 방법은 여러 시간 동안 읽었지 만 어떻게 혼합 할 수 있는지 알지 못했습니다.

PHP와 MyD에서 누구나 어떻게 할 수 있습니까? 나는 그것을 대단히 감사 할 것이다. 커뮤니티에 미리 감사드립니다. 내 영어로 유감스럽게 생각합니다. 영어 실력이 최고!

인사말

편집

나는 U의 모든 투표를하려고하지만 rep15있을 때까지 내가 읽고 있던 나는이 ahahhaa ... 나는 한 가지를 metion 깜빡 수 없습니다 RAND()를 사용하면 테이블 전체를 검사합니다. 내 경우에는 받아 들일 수 없습니다. 테이블이 꽤 크기 때문에 500000 레코드와 AskedQuestions에 대해 1500000 이상에 대한 질문이 ... 그래서 RAND를 수행하는 데 걸리는 시간은 tooo slow ...

나는 비슷한 것을 필요로한다. 질문에 답하고 질문한다. stions 및 세션 사용자 및 idQuestion == idAskedQuestion ... idUser 동등한 것들을 제외하고 거기에서 임의의 하나를 선택?

그럴 수있는 방법이 있으며,이 경우 끔찍할 정도로 느려질 수 있습니다. ??

+2

쇼, 지금까지 시도한 내용. – djot

+0

@djot DB에서 임의의 행을 얻는 방법을 알고 있습니다. 행의 수를 찾고, PHP를 사용하여 0과 COUNT 사이의 임의의 숫자를 찾은 다음 임의의 ID가 생성 된 행을 가져옵니다. 그러나 질문하지 않은 질문 만받는 제한을 추가하면 모든 것이 더 복잡해집니다. 모든 질문이 실현 가능하지 않기 때문에이 절차를 수행 할 수 없습니다. – MauriLopez

+0

@djot 그리고 다른 문제는 어떤 종류의 JOIN을 사용해야한다고 생각하지만, 어떻게 확신 할 수없는 것입니다. 데이터베이스에 대한 지식이 거의 없습니다. 내가 무엇을하지 않고 단지 묻기 위해왔다라고 생각하면, thats ok! 나는 서면으로 된 코드 응답을 원하지 않는다, 나는 약간의 단어와 함께 설명에 만족한다 !! – MauriLopez

답변

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

그것은 다른 질문을 선택합니다

+0

내가 원한다면 왼쪽 가입을 사용하여 할 수 있습니다. –

+0

세션 변수를 사용하고 있습니까? –

+0

예, 세션 변수를 사용합니다. ! 하지만 테이블이 너무 커서 RAND를 사용하고 싶지 않고 시간이 너무 많이 걸립니다! 나는 그것을 어떻게 생각하고 있었는지에 대한 제안을 반영하기 위해 글을 편집했다. – MauriLopez

1

무작위로 질문을 선택합니다

select * from question where idQuestion not in (select idQuestion from AskedQuestions) 

결합 :

select * from question order by rand() limit 1 

선택 질문을하기 전에 물어 보지

select * from question 
where idQuestion not in (select idQuestion from AskedQuestions) 
order by rand() 
limit 1 
+0

그는 묻는 질문에있는 질문을 원하지 않습니다. –

+0

이제 무작위로 주문하지 않았습니다. –

+0

@Webtecher : 조합 된 쿼리에서 무작위로 정렬됩니다. –

0

이미 임의의 행을 선택하려면 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() 

물론, 적절한 값 (아마 PHP 변수)에 의해 1을 교체합니다.

+0

빠른 답변 주셔서 감사합니다! ... 이전 답변에서 다른 사람들에게 말했듯이 RAND를 사용하고 싶지 않습니다. 테이블이 너무 커서 시간이 너무 많이 걸립니다. 나는 그것을 어떻게 생각하고 있었는지에 대한 제안을 반영하기 위해 게시물을 편집했습니다. – MauriLopez

0

시도 : 그런 다음 그것을위한 하나 개의 방법이 쿼리 랜드()를 사용하지 않으면

SELECT * FROM Question, AskedQuestions WHERE AskedQuestions.idQuestion != Question.idQuestion AND AskedQuestions.idPerson = 'PERSON_ID' LIMIT 1 
+0

빠른 답변을 주셔서 감사합니다! ... 이전 답변에서 다른 사람들에게 말했듯이 RAND를 사용하고 싶지 않습니다. 테이블이 너무 커서 시간이 너무 많이 걸립니다.나는 내가 그것을 어떻게 생각하고 있는지에 대한 어떤 제안을 반영하기 위해 게시물을 편집했다. – MauriLopez

+0

Ok. 알아 둘만한. 하지만 IN 문 대신 JOIN을 사용해야합니다. 명령문 내의 부질의는 모든 행에 대해 하위 테이블의 모든 레코드를 선택하므로이를 피하십시오. – iiro

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 

아래에 주어진

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

도움이되기를 바랍니다.

감사

감사

지금까지했던 어떤
+0

빠른 답변을 보내 주셔서 감사합니다. ... 이전 답변에서 다른 사람들에게 말했듯이 RAND를 사용하고 싶지 않습니다. 테이블이 너무 커서 시간이 너무 많이 걸립니다. 나는 그것을 어떻게 생각하고 있었는지에 대한 제안을 반영하기 위해 게시물을 편집했습니다. – MauriLopez

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; 
+0

빠른 답변을 주셔서 감사합니다! ... 이전 답변에서 다른 사람들에게 말했듯이 RAND를 사용하고 싶지 않습니다. 테이블이 너무 커서 시간이 너무 많이 걸립니다. 나는 그것을 어떻게 생각하고 있었는지에 대한 제안을 반영하기 위해 글을 편집했다. – MauriLopez

0

나는 임의 행 효율적으로를 선택하는 방법에 대한 설문 조사를 만들었습니다. 결과는 here입니다.

귀하의 경우, AUTO_INCREMENT이 있습니까? 그렇다면 "사례 : 간격이있는 AUTO_INCREMENT, 1 행이 반환되었습니다."가 귀하의 필요를 충족시키는 지 확인하십시오. 원하지 않는 질문을 걸러내는 WHERE 절은 "간격"을 유발합니다.

그렇지 않은 경우 FLOAT 또는 UUID 접근 방식을 고려하십시오. 어느 쪽이 좋을지라도, 아마도이 "무작위"목적을위한 컬럼이 필요할 것이다.

관련 문제