1

同じ構造(id、var1、var2)の4つのテーブルがあります

var1 のテーブル 1 には単語が 1 つしかありません (150000 以上のレコード)

var1 のテーブル 2 には 2 つの単語があります (50000 以上のレコード)

var1 のテーブル 3 には 3 つの単語があります (50000 以上のレコード)

var1 のテーブル 4 には 4 つ以上の単語 (30000 以上のレコード) があります

それらを検索する最良の方法は何ですか?

私は次のように検索します:

SELECT * FROM (
(SELECT * FROM table1 WHERE var1 LIKE '".$searchWord."' ORDER BY var1)
UNION
(SELECT * FROM table2 WHERE var1 LIKE '".$searchWord." %' OR var1 LIKE '% ".$searchWord." %' OR var1 LIKE '% ".$searchWord."' ORDER BY var1)
UNION
(SELECT * FROM table3 WHERE var1 LIKE '".$searchWord." %' OR var1 LIKE '% ".$searchWord." %' OR var1 LIKE '% ".$searchWord."' ORDER BY var1)
UNION
(SELECT * FROM table4 WHERE var1 LIKE '".$searchWord." %' OR var1 LIKE '% ".$searchWord." %' OR var1 LIKE '% ".$searchWord."' ORDER BY var1)
) AS WHOLEDATABASE ORDER BY var1
");

これを行うのは、最初に 1 つの単語、次に 2 つ、次に 3 つという結果を表示したいからです。

この方法は非常に遅いため、これを行う他の方法はありますか。

4

2 に答える 2

0

concatを使ってみましたか?すべての検索フィールドと注文フィールドがインデックス化されていれば、concat に余分な時間はかからないと思います。

例:

SELECT * 
FROM table1, table2, table3, table4 
WHERE concat_ws(' ',table1.var1, table2.var1, table3.var1, table4.var1) like '%"'.$searchWord.'"%' 
ORDER BY table1.id, table2.id, table3.id, table4.id;

このクエリの唯一の問題は、テーブルの出力構造が変更されることです。

于 2012-04-29T14:51:26.623 に答える
0

結果を結合してから、length(var1) を使用して並べ替えることができます。Union は少し面倒です

于 2012-04-29T11:21:34.827 に答える