1

データベースの検索に使用しているクエリがあります。クエリはコードに組み込まれ、用語はパラメーター化されるため、すべてが適切かつ安全に実行されます。検索フィールドからのユーザー入力に基づいて生成されるため、用語はテーブルから取得できないためです。

すべてが正常に機能します。検索を実行するためのより良い/より高速な方法があるかどうか疑問に思っています。

SELECT
  sum(score * multiplier) score,
  a.id,
  a.title
FROM
(
  SELECT 3 score, 'a railway employee' term UNION ALL
  SELECT 2 score, 'railway employee' term UNION ALL
  SELECT 2 score, 'a railway' term UNION ALL
  SELECT 1 score, 'employee' term UNION ALL
  SELECT 1 score, 'railway' term UNION ALL
  SELECT 0 score, 'a' term
) terms
CROSS JOIN
(
  SELECT 'title' TYPE, 1 multiplier
  UNION ALL SELECT 'summary', 1.1
  UNION ALL SELECT 'detail', 1.5
) X
INNER JOIN
(
  SELECT id, 'title' TYPE, title SEARCH FROM article
  UNION ALL
  SELECT id, 'summary' TYPE, summary SEARCH FROM article WHERE summary <> ''
  UNION ALL
  SELECT artId, 'detail' TYPE, txt SEARCH FROM articleSections
) s ON s.TYPE = x.TYPE AND SEARCH LIKE concat('%', terms.term, '%')
INNER JOIN article a ON a.id = s.id
GROUP BY id, title
ORDER BY score DESC;
;

機能的な簡単なデモはsqlfiddleにあります。

4

1 に答える 1

0

あなたのクエリは私には十分に見えます。ただし、次の各部分の結合条件を繰り返すことで、読みやすさとパフォーマンスを犠牲にしたい場合は、実行計画を少し改善できますUNION

....
INNER JOIN
(
  SELECT id, 'title' TYPE, title SEARCH FROM article
   where title like '%a railway employee%' or 
  title like '%railway employee%' 
  or title like '%a railway%'
  or title like '%employee%'
  or title like '%railway%'
  or title like '%a%'
  UNION ALL ....
于 2013-06-22T19:44:00.663 に答える