-1

私は楽しみのためにデータベースを作成して、データベースをよりよく理解し、PHP を使用していじり回している Web サイトを照会しようとしています。ユーザーがPHP検索ボックスに検索語を入力すると、4つのテーブルを持つ1つのデータベースがほとんどあり、コードは検索語を含むエントリをデータベースで検索します。個々のテーブルを検索するためのコードを簡単に取得できるようになりましたが、4 つのテーブルすべてを検索して同じページに結果を表示することはできないようです。

info: スカイリムのデータベースを作る

  • テーブル名:クラス、パワー、スキル、シャウト
  • 列名:名前、情報

これまでのところ機能するコードのスニペットを次に示します。

$raw_results = mysql_query("
   SELECT *
   FROM   `xaviorin_skyrim`.`shouts` , `xaviorin_skyrim`.`classes`
   WHERE  (CONVERT(`UID` USING utf8) LIKE '%".$query."%' OR
          CONVERT(`Name` USING utf8) LIKE '%".$query."%' OR 
          CONVERT(`Information` USING utf8) LIKE '%".$query."%')
") or die(mysql_error());`

raw_results文字通り、新しいコード行でテーブル名を「shouts」から「classes」に変更するだけでよいと思いましたが、うまくいきませんでした。私はユニオンとジョインを試みましたが、それらを台無しにし続けるか、それらを適切にフォーマットする方法を理解していません。

echo "<p><h3>".$results['Name']."</h3>".$results['Information']."</p>";

このテキストの上のコードは、私のウェブサイトのページに結果を表示するものです...動作しますが、4 つのテーブルすべての情報を 1 つのページに結合する方法がわかりません。私がこれを間違った方法で行っていて、誰かが私を正しい方向に向けることができれば、私はそれを大いに感謝します...私は、適切な答えを見つけることなく、1か月近く問題を調査しようとしています。

4

1 に答える 1

0

あなたのアプローチの問題は、2 つの異なるテーブルからのクエリ結果が複数ある場合に、リレーショナル データベースがクロス結合を行うことです。したがって、基本的に 1 つのテーブルのすべての試合は、2 番目のテーブルのすべての試合と組み合わされます。最初のテーブルに 3 つのエントリがあり、2 番目のテーブルに 4 つのエントリがある場合3 * 4 = 12、クエリ結果にエントリが表示されます。さらにテーブルを追加すると、さらに多くの結果が得られます。まったく関係のない複数のテーブルで全文検索を実行したい場合、それらをクロス結合して何らかの存在しない関係を作成しても役に立ちません。

実際にやりたいことは、いくつかのクエリのUNION ALL(UNION重複を削除するため遅くなります) ことです。

SELECT name, information, 'shouts' AS tablename FROM shouts WHERE ...
UNION ALL
SELECT name, information, 'classes' AS tablename FROM classes WHERE ...

これにより、すべてのテーブルで検索クエリが実行され、結果が 1 つの結果に配置されます。また、結果をマージした後に元のテーブルが失われないように、各クエリに 3 番目の列を追加したことにも注意してください。

後で並べ替えを行う必要がない限り、すべてのステートメントを個別に行うことをお勧めします。この方法でそれらを組み合わせると、後処理がより複雑になる可能性が高くなります。UNIONまた、複数の単一クエリも、ステートメントを含む 1 つの大きなクエリよりも高速です。

mysql_*コメントで述べたように、関数を使用しないでください。

于 2013-03-09T18:03:17.527 に答える