重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

MySQLの事で質問です。

テーブル1~4を結合してフィールド「comment」を検索
する時にフィールド「postDate」の降順でソートしたい
のですがエラーが出ました。

「SQLコマンド」
select text from table1
union all select comment from table2
union all select comment from table3
union all select comment from table4
where match(commentIndex) against("検索ワード" in boolean mode)
order by postDate desc;


試しに
union all select comment from table2
union all select comment from table3
union all select comment from table4
の部分を削除して実行してみた所、成功しました。

後、order by postDate desc;のみ削除した場合でも成功しました。


エラーの内容はこれです↓↓
Unknown column 'postDate' in 'order clause'

フィールド「postDate」は存在します。
(varchar型何ですが、それがいけないと思い
date型やdatetime型と変えてみましたがダメでした)

何とかソートしたいのですがどうすればいいのでしょうか?

A 回答 (1件)

UNIONつまり集合演算子を使った場合、SELECTするカラム以外のソートはできません。


これは、MySQLに限った話ではなく、ANSI/ISO SQLそのものの仕様です。

postDate でソートするなら、SELECTするカラムに postDate が無くてはいけません。
(もちろんUNIONする全テーブルに無いとダメです)

さて、ご質問に対しての回答は以上ですが、以下、Tritonn環境がないので、想像で書きます。

全文検索用のcommentIndex、これも各テーブルにあるものですよね?
だとしたら、ご質問の書き方だとこうなります。

table1→無条件に全表走査(遅い)
table2→無条件に全表走査(遅い)
table3→無条件に全表走査(遅い)
table4→ここだけ全文検索(高速)

各テーブルから検索ワードで全文検索したいのであれば

select text from table1
where match(commentIndex) against("検索ワード" in boolean mode)
union all select comment from table2
where match(commentIndex) against("検索ワード" in boolean mode)
union all select comment from table3
where match(commentIndex) against("検索ワード" in boolean mode)
union all select comment from table4
where match(commentIndex) against("検索ワード" in boolean mode)

にならないといけないと思います。
上記の書き方で初めて

table1→全文検索(高速)
table2→全文検索(高速)
table3→全文検索(高速)
table4→全文検索(高速)

となるのでは?

「それじゃsennaが4回も呼ばれるじゃないか」と思われるかもしれませんが、3回全表走査するよりは、よっぽど高速でしょう。
(各テーブルの件数にもよると思いますが)

インラインビューを使えばsenna1回で書けますけど、せっかくの全文検索の意味がなくなる(却って劇遅になります)し、そもそも、インラインビューでsennaを使うと多分構文エラーになると思います。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す