2011-01-21 5 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 

主な問題は、私が使用しているPHPのフォーラムのページは「親」としてFirstMsg 0とを持つもので、メッセージを認識することです0とMessageIDがFirstMsgに等しいものへの応答として0と異なるFirstMsg。

es。メッセージID 201と201との行は、私は簡単にコンテンツを取得するのMySQLクエリとPHPで201

を投稿する応答として見られるであろう202および203の親である:

$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)) { 

} 

例えば、ローズを探索します

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

私は、クエリで、取得するためにも、「ローズ」の唯一の「親」の要素を、必要とする親メッセージだけでに存在でもある。私は、whileループ内のコンテンツをエコー、取得します返信の1つ:

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

MySqlクエリのみを変更することは可能ですか?私はそれが必要なのは、クエリ自体が、同じページの中で、ページ数あたりの最大メッセージ数が増えたときにPHPによって生成された "ページ"間を移動するためです。助けを前にありがとう。

+1

にを変更、親メッセージでソートしたい場合は、フォーマットに時間がかかるしてください( "{}"エディタコントロールを使用して)問題のコードを適切に記述してください。 –

答えて

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 

あなたが将来的にp.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におけるフィルタリングの一部を行うことができます。 MySQLでそれをフィルタリングするために

、私はこのような何かを考えていた:


(
    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のクエリにはうまくいかない。しかし、あなたは確かに、アイデアを取得しないでください?さらに、私は確信しています。より良い解決法を提案する多くの専門家がここにいます。がんばろう! :-)

+0

私はフィルタリングを行いましたが、うまくいきましたが、主な問題は、それを使ってページ間を移動することができないということでした。 mysqlは、不思議なことに、結果として行を取得しません。それでも、あなたの答えをありがとう:) – Sofia

関連する問題