

下記コードのようにDBテーブルのbodyカラムにある「おいしい」や「まずい」など複数の文字列の合計ををBladeに表示出来ておりますが、一つの投稿に「おいしい」や「まずい」などの単語が複数あれば、複数としてカウントされてしまうようですので、DISTINCTを使い、投稿内の文章に同じ単語が重複して1と数えさせる場合、下記のようにwhereの前に書き足すかと思いましたが、文章中に「おいしい」が3回あったら3回と数えてしまいました。  
お手数をおかけしますが、どう修正すればよいかご教授いただければ幸いです。よろしくお願いいたします。

Controller:

[code]

    $posts = DB::table('Post')->select( db::raw( "body,
    (LENGTH(body) - LENGTH(REPLACE(body, 'おいしい', ''))) / LENGTH('おいしい') AS cntA,
    (LENGTH(body) - LENGTH(REPLACE(body, 'まずい', ''))) / LENGTH('まずい') AS cntB,
    ")->distinct()->where('user_id', $user)->get();
    
[/code]

Blade:

[code]

    <p>「おいしい」は全部で {{$posts->sum('cntA')}}回でした。</p>
    <p>「まずい」は全部で {{$posts->sum('cntB')}}回でした。</p>
    
[/code]


CC BY-SA 4.0
2022-03-19T12:08:12.347
87917
2022-03-20T05:07:47.747
2022-03-19T13:06:37.750
3060
49069
question
php mysql laravel
投稿内の文章に同じ単語が重複して1と数えさせるにはSQLの構文をどう修正すればよろしいでしょうか。


「`body` に `'おいしい'` が 1 回 **以上** 含まれているレコードの数を数えたい」ということであれば `body like
'%おいしい%'` の数を `sum(body like '%おいしい%')` のように数えれば良さそうです。

ただしレコードの行数や `body` の大きさによっては重い処理になることがあるので、そうなった場合は全文検索エンジンの導入など RDBMS
以外の方法での処理を考えることになりそうです。


CC BY-SA 4.0
2022-03-20T05:07:47.747
87924
2022-03-20T05:07:47.747
19110
87917
answer