1

私はphpとmysqlを使って高度な検索機能に取り組んでいます。

テーブルは次のとおりです。

blogPost[id, title, description]

water[id, title, description,]

waterSpecie[id, waterId, specieId]

specie[id, name]

user[id, username]

私がやりたいことはこれです: ユーザーはテキスト フィールドからキーワードを検索でき、結果は一度だけ一意でなければなりません。例えば:

ユーザーがタラを検索すると、タイトルまたは説明にタラが含まれるすべてのブログ投稿と、タラが含まれるすべての水域、およびユーザーがタラにニックネームが付けられているかどうかを表示したいと思います。しかし、blogPost のタイトルと説明に cod が含まれているとしたら、結果リストに 2 回表示されたくありません。

しかし、blogPost テーブルのタイトルに cod が含まれているとだけ言えば、それを表示したいだけで、他には何も表示したくありません。

私はこの sql クエリでそれを行うことができました: blogPost テーブルをそのクエリに追加し、そこから検索できるようにしたいと思います。そのため、cod を持つテーブルが 1 つだけの場合は、そのテーブルの結果のみを表示したいと考えています。

SELECT DISTINCT W.lat, W.lng, W.municipalityId, W.title, W.description
FROM water AS W, specie AS S, waterSpecie AS WS 
WHERE S.name LIKE '%$term%' AND W.id = WS.waterId AND S.id = WS.specieId
OR    W.title LIKE '%$term%' AND W.id = WS.waterId AND S.id = WS.specieId;

私の問題を説明できたことを願っています。うまくいけば、この問題について助けが得られることを願っています。

4

2 に答える 2

1

あなたはこれを試すかもしれません:

    Select distinct tablename,id from
(select 'blogpost', as tablename, id, title as searchfield from blogpost
union
select 'blogpost' as tablename, id, description as searchfield from blogpost
union
select 'water' as tablename, id, description as searchfield from water
union
select 'specie' as tablename, id, name as searchfield from specie
union
select 'user' as tablename, id, username as searchfield from user) searcher
where searcher.searchfield='cod'

waterSpecie で何が起こっているのか正確にはわからないので、省略しました。

次のような結果が得られるはずです。

tablename   id
blogpost     5
user        12

次に、データベースにクエリを実行して、id=5 の blogpost からレコードを取得し、id=12 のユーザーからレコードを取得できます。

これは、PHP でプログラムによって行うことができます。また、検索機能に追加したいテーブルを追加する場合は、結合を作成して WHERE 句に別の部分を追加するのではなく、以下のクエリに UNION を追加するだけで済みます。

これが Amazon.com のサイズに収まるかどうかはわかりませんので、そこまで大きくなる前に、私よりも優れた人に相談してください。

于 2012-06-13T16:11:02.697 に答える
0

MySQL クエリを簡素化し、PHP コードで結果を結合することによって、最適なサービスが提供されます。あなたの場合の主な理由は、異なる結果を組み合わせたいということです-検索用語および/または水がある場合はブログエントリ、検索用語がある場合はその他のもの。

疑似コードでは、次のようにします (もちろん、実際のコードでは DAO を使用します)。

$foundposts = findblogposts($searchterm);
$foundusers = findusers($searchterm);
$foundwaters = findwaters($searchterm);
// etc

if($foundposts){
    print($foundposts);
}
if($founduers){
    print($foundusers);
}
if($foundwaters){
    print($foundwaters);
}
// etc

そうすれば、ブログの投稿を正しく表示したり、ユーザーを正しく表示したりするために必要となるさまざまな書式設定要件を処理できます。

于 2012-06-13T14:26:06.490 に答える