「記事」と「コメント」のようなhas_manyな関係のテーブルがあるとします。
ここから、記事本文と、子のコメント本文両方を対象にしたLIKE検索を行おうとしています。
articles
id | text |
---|---|
1 | あああ |
comments
id | article_id | text |
---|---|---|
1 | 1 | いいい |
2 | 1 | ううう |
検索自体は、以下のようにGROUP_CONCATを使うことで実現できました。
ruby
1 articles = Article 2 .joins(:comments) 3 .group("comments.article_id") 4 .having("CONCAT(articles.text, GROUP_CONCAT(comments.text)) like '%検索ワード%'") 5 .limit(10).offset(10) 6
加えて、limit,offsetを考慮しない「検索条件にあてはまる全件数」をカウントする必要があります。
そこで、こちらの記事を参考に、
articles.except(:limit, :offset).count
などと試したのですが、groupやhavingがある場合(?)クエリエラーとなってしまいうまくいきません。
何かいい方法はないでしょうか?
そもそもGROUP_CONCATで検索している部分から否定して頂いても構いません。
何卒よろしくお願い致します。
追記:
.countで出力されたSQLは以下のような感じで、
SELECT COUNT(*) AS count_all, comments.article_id AS comments_article_id FROM `articles` INNER JOIN `comments` ON `comments`.`article_id` = `articles`.`id` GROUP BY comments.article_id HAVING (CONCAT(articles.description, GROUP_CONCAT(comments.description)) like '%ワード%')
1054 - Unknown column 'articles.description' in 'having clause'
となってしまいます。
- このエラーが出るのはカウント時のみで、selectを「articles.*」に置き換えると問題なく通ります。
- HavingをWhereに置き換えるとGROUP_CONCATが使えなくなってしまいます。
- エラー箇所であるarticles.descriptionを消すとクエリは通るのですが、当然記事本文が検索対象に含まれなくなります。
- そもそも、SELECTでcount_allのほかにcomments_article_idも指定されている理由もわかりません…。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/12/07 01:58