2011-01-21 1 views
1

간단한 포럼에 대한 검색 양식을 작성하고 있지만 관심있는 필드 만 선택할 수있는 솔루션을 찾을 수 없습니다. 포럼 테이블라는 "메시지"(MySQL은)이 구조를 사용인덱스 정렬로 사용되는 특정 행만 선택하도록 MYSQL 쿼리를 수정하십시오.

MessageID - FirstMsg - Content 
201 - 0 - Jack and Rose 
202 - 201 - Rose 
203 - 201 - Jack, Rose, David 
204 - 0 - Bill 
205 - 204 - Rose 
206 - 0 - Rose and David 
207 - 206 - David 

주요 문제는 내가 "부모"로 FirstMsg 0 메시지와 사람으로 인식 사용하고 PHP는 포럼 페이지 0과 MessageID가 FirstMsg 인 응답에 대해 0과 다른 FirstMsg.

es. 로즈 찾고, 예를 들어

$MySql = "SELECT * FROM Messages WHERE Content LIKE '%$Search%'" ORDER BY Date DESC LIMIT 1, 30"; 
$Result = mysql_query($MySql); 
while($rs = mysql_fetch_array($Result)) { 

} 

:의 MessageID 201 I 쉽게 콘텐츠를 MySQL의 쿼리 및 PHP로 201

게시물 (202) 및 응답으로 간주한다 (203)의 부모이다으로 201 행

201 - 0 - Jack and Rose 
202 - 201 - Rose 
203 - 201 - Jack, Rose, David 
205 - 204 - Rose 
206 - 0 - Rose and David 

내가 쿼리로 얻을도 "로즈"만 "부모"요소를 필요로하는 부모 메시지 만에 존재도있다 : 나는 while 루프의 내용을 메아리 얻을 답장 중 하나는 다음과 같습니다.

201 - 0 - Jack and Rose 
204 - 0 - Bill 
206 - 0 - Rose and David 

MySql 쿼리 만 변경할 수 있습니까? 나는 그 자체가 쿼리 자체가 페이지 당 최대 메시지 수 이후에 카운트가 증가 할 때 PHP에 의해 생성 된 "페이지"사이를 탐색하는 데 사용되기 때문에 필요합니다. 모든 도움을 미리 감사드립니다.

+1

p.Date에, 부모 메시지를 기준으로 정렬 변경하려면 ("{}"편집기 컨트롤을 사용하여) 질문에 적절하게 코드를 작성하십시오. –

답변

0

만 부모 메시지를 얻고 싶다면 :

SELECT DISTINCT p.* 
FROM Messages m JOIN Messages p 
    ON m.FirstMsg = p.MessageID 
     OR (m.FirstMsg = 0 AND m.MessageID = p.MessageID) 
WHERE m.Content LIKE '%$Search%' 
ORDER BY m.Date DESC LIMIT 1, 30 

당신이를 포맷하는 시간을하시기 바랍니다 m.Date 앞으로

+0

나는 코드를 시도했지만 중복 된 답을 많이 얻는다. 그들을 피할 수 있습니까? 답해 주셔서 감사합니다 :) – Sofia

+0

'DISTINCT' 키워드를 추가하십시오 –

+0

고마워, 지금은 잘 작동합니다. 쿼리를 완료하는 데 많은 시간이 필요합니다. 정상입니까? – Sofia

1

당신은 기본적으로 같은 결과를 필터링해야합니다

 
- set finalResultSet as nothing 
- if the FirstMsg = 0 : then union MessageID with finalResultSet 
- else : union FirstMsg with finalResultSet 

당신은 위의 조건과 PHP에서 필터링 부분을 할 수 있습니다.


(
    SELECT MessageID FROM Messages 
    WHERE 
     FirstMsg=0 AND 
     Content LIKE '%$Search%' 
    ORDER BY Date DESC LIMIT 1, 30 
) 
UNION 
(
    SELECT FirstMsg FROM Messages 
    WHERE 
     Content LIKE '%$Search%' 
    ORDER BY Date DESC LIMIT 1, 30 
) 

고 비효율적 :

내가 이런 식의 생각, MySQL은 그것을 필터링합니다. 나는 MySQL 쿼리를 잘하지 못한다. 그러나 당신은 분명히 그 아이디어를 얻었습니까? 게다가 더 나은 솔루션을 제안 할 많은 전문가가 여기 있습니다. 행운을 빕니다! :-)

+0

PHP에서는 필터링을했는데 작동했지만 주요 문제는 페이지간에 이동하는 데 사용할 수 없다는 것이 었습니다. mysql은 이상하게도 모든 행을 결과로 가져 오지 않습니다. 그래, 고마워, 너의 대답을 위해 :) – Sofia