3

2 つのテーブルで出現する単語 (キーワード検索) を選択する必要があり、作成したクエリは次のようになります。

SELECT t1.fname, t1.lname, t2.* FROM t1 , t2  
     WHERE t2.title LIKE "%test%" 
     OR t2.desc LIKE "%test%" 
     OR t2.inc LIKE "%test%" 
     OR t1.fname LIKE "%test%" 
     OR t1.lname LIKE "%test%" 
     AND t1.c_id = t2.c_id;

データベースには大量のデータがあるため、この特定の検索 (「test」キーワードを使用) には数分かかり、これを最適化する方法を考えています。LEFT JOIN を試してみましたが、間違っていたようです。結果はかなり遅れますが、クエリは非常に迅速に実行されます。

次のようになります。

SELECT * FROM t2 AS a 
  LEFT JOIN t1 AS b ON a.c_id = b.c_id 
    WHERE a.desc LIKE '%test%' 
     OR a.title LIKE '%test%' 
     OR a.inc LIKE '%test%' 
     OR b.fname LIKE '%test%'  
     OR b.lname LIKE '%test%';

どんな助けでも大歓迎です...ありがとう。

4

2 に答える 2

2

最初のステートメントは意図したものではありません。AND句が優先されるORため、実際に記述しました

t2.title LIKE "%test%" 
OR t2.desc LIKE "%test%" 
OR t2.inc LIKE "%test%" 
OR t1.fname LIKE "%test%" 
OR (t1.lname LIKE "%test%" AND t1.c_id = t2.c_id;)

これにより、最終的にt1 と t2 の間の(多少歪んだ) 自然な結合が発生し、はるかに多くの行が返されます。

于 2013-01-09T08:01:23.670 に答える
2

MATCH..AGAINSTを試して、 MyISAMテーブルの複数の列を検索します。

SELECT * 
FROM t2 AS a 
INNER JOIN t1 AS b ON a.c_id = b.c_id 
WHERE MATCH (a.desc, a.title, a.inc, b.fname, b.lname) AGAINST ('test') 

このリンクを確認してくださいMYSQL FULL TEXT SEARCH

于 2013-01-09T08:45:51.757 に答える