2

この質問は、同じように機能するインデックス作成またはUNIONの代替案に関するものです。

さらなる例では、私たちは仮定title textし、contentfulltextindex

3つのステートメントがあると想像してください

SELECT title as text FROM news ORDER BY score DESC
SELECT name as text FROM pages ORDER BY score DESC
SELECT content as text FROM comments ORDER BY score DESC

それらを組み合わせることができます(手動で注文することに注意してください)

SELECT title as text FROM news ORDER BY score DESC
UNION
SELECT name as text FROM pages ORDER BY score DESC
UNION
SELECT content as text FROM comments ORDER BY score DESC

これでtext印刷できるようになりましたが、注文は1)ニュース2)ページ3)コメントになります

おそらくスコアによって異なる順序で並べてほしいので、それは非常に悪いです

THREE SELECTSしたがって、これらすべてを組み合わせてONE SELECT注文することができます

SELECT text FROM (
   SELECT title as text FROM news ORDER BY score DESC
   UNION
   SELECT name as text FROM pages ORDER BY score DESC
   UNION
   SELECT content as text FROM comments ORDER BY score DESC
) as combination

今、私たちはORDERそれをすることができますscore

繰り返しますが、スコアは選択全体ではなくテーブルごとに基づいているため、これは非常に悪いことです。

それで、先に進み、私の質問が近づきます。

次のステップは紹介することMATCH() and AGAINST()であり、私たちは書く

SELECT text, MATCH(text) AGAINST ('anything') as total_score FROM (
       SELECT title as text FROM news ORDER BY score DESC
       UNION
       SELECT name as text FROM pages ORDER BY score DESC
       UNION
       SELECT content as text FROM comments ORDER BY score DESC
    ) as combination ORDER BY total_score DESC

完了です!MATCH(text)が全文として索引付けされていないように見えない場合は、すべてが完全に機能するはずです。

エラーが表示されます:列リストに一致するFULLTEXTインデックスが見つかりません

今、consufionが来て、おそらく何も残っていませんが、どういうわけかを作成textFULLTEXTます。残念ながら、textデータベースに存在するような列はありません。たとえば、phpmyadminでそのようにするための列を見つけることができないとしましょうFULLTEXT

さらに伸ばして、どこにも見つからないようなものname as textに近づけることを考えました。name as text type fulltext

私を助けてください、私は何かを聞きたいです、多分そのような状況で回避する別の方法がありますか?知らない。とてもありがたいです。

4

1 に答える 1

2

UNION ALLの代わりに使用しUNIONます。

UNION 結合された結果セットをソートし、重複 (存在する場合) を破棄します。

UNION ALL選択した順序を保持します (重複がある場合は保持します)

于 2012-12-16T19:17:40.883 に答える