3

私は次の表を持っています。

エントリテーブルの説明

+-------------+-------------------+------+-----+---------+----------------+
| Field       | Type              | Null | Key | Default | Extra          |
+-------------+-------------------+------+-----+---------+----------------+
| id          | int(11) unsigned  | NO   | PRI | NULL    | auto_increment |
| title       | varchar(255)      | YES  |     | NULL    |                |
| slug        | varchar(255)      | YES  |     | NULL    |                |
| description | text              | YES  |     | NULL    |                |
| user_id     | int(10) unsigned  | NO   |     | NULL    |                |
| unsafe      | enum('0','1')     | NO   |     | NULL    |                |
| copyright   | enum('0','1')     | NO   |     | 0       |                |
| status      | enum('0','1','2') | NO   |     | 0       |                |
| date_add    | datetime          | NO   |     | NULL    |                |
+-------------+-------------------+------+-----+---------+----------------+

タグテーブルは説明します

+-------------+---------------------+------+-----+---------+----------------+
| Field       | Type                | Null | Key | Default | Extra          |
+-------------+---------------------+------+-----+---------+----------------+
| id          | bigint(20) unsigned | NO   | PRI | NULL    | auto_increment |
| relation_id | int(10) unsigned    | NO   |     | NULL    |                |
| name        | varchar(255)        | NO   |     | NULL    |                |
+-------------+---------------------+------+-----+---------+----------------+

entry.title と tag.name で検索したい。このクエリのパフォーマンスはどうですか。

私はフルテキストを使用し続けます。どうやって ?

4

5 に答える 5

1

タグがエントリにどのように関連しているかわからないので、relation_idがエントリIDであると想定します。

SELECT 
    e.*
FROM entry e
WHERE MATCH(title) AGAINST ('{search string}')
{maybe a limit and/or order here}
UNION
SELECT
    DISTINCT
    e.*
FROM entry e
JOIN tags t ON t.relation_id = e.id
WHERE t.name IN ('word1','word2',...)#{search string} split by whitespace
{maybe a limit and/or order here}
于 2012-07-26T17:09:21.210 に答える
1

まず、タイトル フィールドと名前フィールドの両方がインデックス化されていることを確認する必要があります (送信した情報では確認できません。tag.relation_id は entry.id に関連していると想定しています。したがって、次のように検索できます。

SELECT * FROM entry as e JOIN tags as t on e.id = t.relation_id WHERE e.title LIKE('%YOURSEARCH%') OR t.name LIKE('%YOURSEARCH%')
于 2012-07-26T17:01:01.490 に答える
1

列に結合して属性を表示するというentry . titleことtag . nameですentry . user_idtag . relation_id?それが必要な場合は、以下の SQL クエリを確認できます。

SELECT entry . title , tag . name
FROM entry
INNER JOIN tag ON entry . user_id = tag . relation_id
ORDER BY entry . title

entry . titleクエリ文字列を使用して値と属性を検索している場合は、次のtag . nameコードを確認してください。

$q = $_GET["q"];

$result = mysqli_query($con, 'SELECT entry . title , tag . name
FROM entry
INNER JOIN tag ON entry . user_id = tag . relation_id
WHERE entry . title LIKE "%' . $q . '%"
OR tag . name LIKE "%' . $q . '%"');

たとえば、検索者がdomain.com/?q=testにアクセスすると、システムはtestに一致するテキストがあるかどうかを調べ、見つかった場合、その単語を含むとの行*(s)* は次のようになります。結果。entry . titletag . nameentry . titletag . name

ここで、クエリ文字列?q=の値を含むすべての属性を表示する場合は、SELECT *. これをチェックしてください:

$q = $_GET["q"];

$result = mysqli_query($con, 'SELECT *
FROM entry
INNER JOIN tag ON entry . user_id = tag . relation_id
WHERE entry . title LIKE "%' . $q . '%"
OR tag . name LIKE "%' . $q . '%"');

または、次のようにすべてTableName . AttributeFieldの s を手動で含めます。

$q = $_GET["q"];

$result = mysqli_query($con, 'SELECT entry . id , entry . title , entry . slug , entry . description , entry . user_id , entry . copyright , entry . status , tag . id , tag . relation_id , tag . name
FROM entry
INNER JOIN tag ON entry . user_id = tag . relation_id
WHERE entry . title LIKE "%' . $q . '%"
OR tag . name LIKE "%' . $q . '%"');

PS 「tags」テーブルの名前を「tag」に変更することを忘れないでください。

于 2013-04-07T08:41:24.957 に答える
1

そこで、タイトルを検索し、タグを使用して結果を絞り込むシステムを探しています。これはあなたが探しているものですか?

これを実現するには、最初にタイトル検索の結果を表示し、次にこのページのようなリンクとしてタグを付けます「mysql検索タイトル、説明、および複数行タグ」はタイトルであり、結果と結果表示タグはボタンとして「mysql search full-text-search " タグをクリックすると、特定の結果が表示されます。

より多くの情報やシナリオを提供していただけると、より良い解決策を得るのに役立ちます.

于 2013-04-11T23:48:18.263 に答える