0

私のクエリでは、 に割り当てることがFULLTEXT INDEXできないという問題に遭遇しましたがDERIVED TABLE、これは正常なようです。

の例は、dataとしてインデックス付けできないことを示していますFULLTEXTcontent、 、text、および列は、「実際の」テーブルのようにrecord既にインデックス付けされていますFULLTEXT

SELECT `data` FROM SELECT(
   SELECT `content` as `data` FROM `table1`
   UNION SELECT `text` as `data` FROM `table2`
   UNION SELECT `record` as `data` FROM `table3`
) as `search`

実際のコードではSELECT MATCH() AGAINST()、テーブルからスコアを取得するscoreために使用し、それらを UNION して各テーブルを取得します。これらの UNION はサブクエリであり、最初のレベル (メイン) の SELECT は、それらの UNION を派生テーブルとして選択し、それらからスコアを計算しますが、これはまだ完成してない。参照に INDEX がないというエラーが発生します。(上記の例のように)。

これらが、JOINSで私の目標を達成できるかどうかを尋ねることにした理由です.

これが私の実際の(動作する)コードです:

SELECT *,MATCH(`data`) AGAINST('keyword' IN BOOLEAN MODE) as `relevance` 
FROM (                  
        SELECT CONCAT(`title`,' ',`content`) as `data`,`id`,'tmp_pages' as `table`, 
        MATCH(`title`,`content`) AGAINST ('keyword') AS `score` 
        FROM `tmp_pages` 
        WHERE MATCH(`title`,`content`) AGAINST ('keyword')
        UNION 
        SELECT CONCAT(`title`,' ',`content`) as `data`, `id`,'tmp_news' as `table`, 
        MATCH(`title`,`content`) 
        AGAINST ('keyword') AS `score` 
        FROM `tmp_news` 
        WHERE MATCH(`title`,`content`) AGAINST ('keyword')
        UNION 
        SELECT CONCAT(`title`,' ',`content`) as `data`,`id`,'tmp_comments' as `table`, 
        MATCH(`title`, `content`) 
        AGAINST ('keyword') AS `score` FROM `tmp_comments` 
        WHERE MATCH(`title`, `content`) AGAINST('keyword')
        UNION 
        SELECT CONCAT(`manufacturer`,' ',`model`,' ',`location`,' ',`other`,' ',`contact`) as `data`,`id`,'tmp_auction_auto' as `table`,
        MATCH(`manufacturer`,`model`,`location`,`other`,`contact`) AGAINST ('keyword') AS `score` 
        FROM `tmp_auction_auto` 
        WHERE MATCH(`manufacturer`,`model`,`location`,`other`,`contact`) 
        AGAINST ('keyword')
) as `search` ORDER BY `relevance` DESC

JOINこの部分をクエリのタイプに変えて、期待どおりに機能させることができるかどうかを知りたいです。もしそうなら、私はそれを行う方法を親切に尋ねます。

4

1 に答える 1

1

テーブルは無関係なので、これを JOIN として行うことはできないと思います。relevanceただし、外側のクエリから列を省略し、次の順序で並べ替えるだけで、エラーを取り除くことができるはずですscore

SELECT *
FROM (                  
        SELECT CONCAT(`title`,' ',`content`) as `data`,`id`,'tmp_pages' as `table`, 
        MATCH(`title`,`content`) AGAINST ('keyword') AS `score` 
        FROM `tmp_pages` 
        WHERE MATCH(`title`,`content`) AGAINST ('keyword')
        UNION 
        SELECT CONCAT(`title`,' ',`content`) as `data`, `id`,'tmp_news' as `table`, 
        MATCH(`title`,`content`) 
        AGAINST ('keyword') AS `score` 
        FROM `tmp_news` 
        WHERE MATCH(`title`,`content`) AGAINST ('keyword')
        UNION 
        SELECT CONCAT(`title`,' ',`content`) as `data`,`id`,'tmp_comments' as `table`, 
        MATCH(`title`, `content`) 
        AGAINST ('keyword') AS `score` FROM `tmp_comments` 
        WHERE MATCH(`title`, `content`) AGAINST('keyword')
        UNION 
        SELECT CONCAT(`manufacturer`,' ',`model`,' ',`location`,' ',`other`,' ',`contact`) as `data`,`id`,'tmp_auction_auto' as `table`,
        MATCH(`manufacturer`,`model`,`location`,`other`,`contact`) AGAINST ('keyword') AS `score` 
        FROM `tmp_auction_auto` 
        WHERE MATCH(`manufacturer`,`model`,`location`,`other`,`contact`) 
        AGAINST ('keyword')
) as `search` ORDER BY `score` DESC
于 2012-12-17T19:03:04.253 に答える