7

私は現在、独自の CMS をコーディングしており、search.php. 私のサーバーは最速ではないため、1 つのクエリ内で異なる列名を持つ 4 つのテーブルを検索する必要があります。

私のDBの配置があります:

cmw_admin(ユーザー テーブル)

+-----------------+------------+------+-----+---------+----------------+
| Field           | Type       | Null | Key | Default | Extra          |
+-----------------+------------+------+-----+---------+----------------+
| id              | int(11)    | NO   | PRI | NULL    | auto_increment |
| role            | int(11)    | NO   |     | 1       |                |
| username        | text       | NO   |     | NULL    |                |
| password        | text       | NO   |     | NULL    |                |
| email           | text       | NO   |     | NULL    |                |
| phone           | text       | NO   |     | NULL    |                |
| location        | text       | NO   |     | NULL    |                |
| full_name       | text       | NO   |     | NULL    |                |
| bio             | text       | NO   |     | NULL    |                |
| website         | text       | NO   |     | NULL    |                |
| last_login      | datetime   | NO   |     | NULL    |                |
| registered_date | datetime   | NO   |     | NULL    |                |
| registered_ip   | text       | NO   |     | NULL    |                |
| credits         | tinyint(1) | NO   |     | NULL    |                |
| online          | int(11)    | NO   |     | 0       |                |
+-----------------+------------+------+-----+---------+----------------+

cmw_blog(記事表)

+------------+----------+------+-----+---------+----------------+
| Field      | Type     | Null | Key | Default | Extra          |
+------------+----------+------+-----+---------+----------------+
| id         | int(11)  | NO   | PRI | NULL    | auto_increment |
| title      | text     | NO   |     | NULL    |                |
| content    | text     | NO   |     | NULL    |                |
| date       | datetime | NO   |     | NULL    |                |
| author     | int(11)  | NO   |     | NULL    |                |
| categories | text     | NO   |     | NULL    |                |
| media      | text     | NO   |     | NULL    |                |
| thumb      | text     | NO   |     | NULL    |                |
+------------+----------+------+-----+---------+----------------+

cmw_projects(ポートフォリオ)

+-------------+------------+------+-----+---------+----------------+
| Field       | Type       | Null | Key | Default | Extra          |
+-------------+------------+------+-----+---------+----------------+
| id          | int(11)    | NO   | PRI | NULL    | auto_increment |
| owner_id    | int(11)    | NO   |     | NULL    |                |
| title       | text       | NO   |     | NULL    |                |
| content     | text       | NO   |     | NULL    |                |
| date        | date       | NO   |     | NULL    |                |
| link        | text       | NO   |     | NULL    |                |
| img         | text       | NO   |     | NULL    |                |
| type        | int(11)    | NO   |     | NULL    |                |
| start_date  | date       | NO   |     | NULL    |                |
| end_date    | date       | NO   |     | NULL    |                |
| done        | tinyint(1) | NO   |     | 0       |                |
| screenshots | text       | NO   |     | NULL    |                |
+-------------+------------+------+-----+---------+----------------+

cmw_services(サービス表)

+-------------+---------------+------+-----+---------+----------------+
| Field       | Type          | Null | Key | Default | Extra          |
+-------------+---------------+------+-----+---------+----------------+
| id          | int(11)       | NO   | PRI | NULL    | auto_increment |
| cat_id      | int(11)       | NO   |     | NULL    |                |
| name        | text          | NO   |     | NULL    |                |
| description | text          | NO   |     | NULL    |                |
| img         | text          | NO   |     | NULL    |                |
| price       | decimal(11,2) | NO   |     | NULL    |                |
+-------------+---------------+------+-----+---------+----------------+

私の検索では、すべての / 列とすべての / 列でも文字列を検索する必要nametitleありdescriptionますcontent。明確に言えば、これらすべてのテーブルで 1 つの文字列を 1 つのクエリだけで検索したいと考えています。それは可能ですか?JOINLEFT JOINRIGHT JOINおよびを使用するのINNER JOINは簡単かもしれませんが、それらの使用方法がわかりません。Googleはそのことについてあまり明確ではありません!

4

2 に答える 2

4

4つの連続したクエリの合計コストは、おそらく、JOINとそれらの同じレコード/フィールドの検索のコストよりもはるかに低くなります。

どちらかといえば、FULLTEXTインデックスの可能性を確認してください。

いずれにせよ、あなたは次のようなものでこれを行うことができます

 SELECT "cmw_admin" as source, id FROM cmw_admin, NULL as date [...] WHERE bio LIKE '%search%'
 UNION
 SELECT "cmw_blog"  as source, id FROM cmw_admin, date as date [...] WHERE
     (title LIKE '%search%' OR content LIKE '%search%')
 UNION
 ...

これにより、見つかったレコードのリストと、レコードの出所のヒント( "cmw_admin"、 "cmw_blog"、...)が表示されます。これにより、さまざまなソースからのレコードを提示する方法を選択できます。

クエリは常に同じフィールドのセットを返します。「ソース」が何であるかに応じて、有効な値を持つものとそうでないものがあります。次に、PHPスクリプトで、次のようなことを行うことができます。

 $source = $record['source'];
 if (!isset($template[$source]))
     $template[$source] = file_get_contents("templates/search/$source.html");

 $html_view = preg_replace('#{{\s*([^}\s]*)\s*}}#e', 'isset(\$record["\1"])?\$vars["\1"]:""', $template[$source]);

これは、次のようなHTMLフラグメントを含むHTMLテンプレートを取ります。

 <h2>{{ date }}</h2>

そして、現在の$recordの[date]エントリをフィールドに「入力」します。これは、HTMLとコードを分離しておくための良い方法だと思います(YMMV)。すでにテンプレートシステムを使用している場合は、代わりにそれを適応させることができます(そしてそうすべきです!)。

于 2012-07-16T17:50:27.420 に答える
1

mysql のみで検索する場合は、FULLTEXT インデックスが最適です。

検索するときは、一致が見つかったテーブルに基づいて異なるリンク/結果 html を構築する必要がある可能性が高いため、単一のクエリ pr テーブルを使用する必要があります。

ただし、Apache Lucene のような実際の検索エンジンを調べることを検討する必要があります。Zend には、外部サービスに依存しない非常に優れた実装がありますhttp://framework.zend.com/manual/en/zend.search.lucene.html/よりも結果をランク付けするのに役立ちますmysql であり、より適切にスケーリングする必要があります。

于 2012-07-16T17:56:21.643 に答える