人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

MySQLについて質問です。

【本テーブル】
no連番
title本のタイトル
desc本の概要

【感想テーブル】
no 連番
book_no 本テーブルのID
title感想タイトル
contents 本の感想

上記のような書籍とそのレビューテーブルについて、

検索フォームから、例えば「秀逸」と入力されたとして

【本のタイトル】
【本の概要】
【感想のタイトル】
【本の感想】

上記の4フィールドを対象にし、該当する本を検索をするMySQL文はどのように書けばよいでしょうか?

感想テーブルには、同一の本の感想が入るのですが、テーブルの結合をどうすればよいか良く解りませんでした。

宜しくお願いいたします。

●質問者: ruijio
●カテゴリ:ウェブ制作
✍キーワード:MySQL タイトル フィールド レビュー 入力
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● chuken_kenkou
●50ポイント ベストアンサー

MySQLの質問をする場合、MySQL 4.1、5.0、5.1といったレベルまで、最低限バージョンを明記するようにしてください。大きな機能差、一部の仕様変更があります。

母体データは何行くらいあり、その中から何行くらいが検索対象となり、最終的にどういう検索結果を得たいのでしょうか?

母体データ件数が多く、その中からある程度性能を確保しながらという話であれば、更新が殆どないことを前提に、全文検索といった機能を使う方法もあります。

そこまで本格的でなく、4列に対し同じキーワードで任意一致の検索を行うなら、LIKE条件をORで繋ぐといった方法になります。


set @keyword='秀逸';
select
 *
 from `tHon` as H
 left join `tKansou` as K
 on H.`no`=K.`book_no`
 where H.`title` like concat('%',@keyword,'%') 
 or H.`desc` like concat('%',@keyword,'%') 
 or K.`title` like concat('%',@keyword,'%') 
 or K.`contents` like concat('%',@keyword,'%') 
 order by H.`no`,K.`no`
;

ちなみに、MySQL 5.1で、以下のような定義、データでテストしてみました。

drop table if exists `tHon`;
drop table if exists `tKansou`;

create table `tHon`
(`no` int primary key auto_increment
,`title` varchar(50)
,`desc` varchar(254)
);

create table `tKansou`
(`no` int primary key auto_increment
,`book_no` int
,`title` varchar(50)
,`contents` varchar(254)
);

insert into `tHon` values
 (null,'book1傑作本','これは傑作質問集')
,(null,'book2秀逸本','これは傑作質問集')
,(null,'book3駄作本','これは駄作質問集')
,(null,'book4傑作本','これは傑作質問集')
,(null,'book5秀逸本','これは傑作質問集')
,(null,'book6駄作本','これは駄作質問集')
;

insert into `tKansou` values
 (null,1,'これは秀逸と思う',null)
,(null,1,'これは秀逸と思う','これは本当に秀逸だ')
,(null,1,'これは傑作と思う','これは本当に秀逸だ')
,(null,1,'これは傑作と思う','これは本当に傑作だ')
,(null,1,null,'これは本当に傑作だ')
,(null,1,null,'これは本当に秀逸だ')
,(null,2,'これは秀逸と思う',null)
,(null,2,'これは秀逸と思う','これは本当に秀逸だ')
,(null,2,'これは傑作と思う','これは本当に秀逸だ')
,(null,2,'これは傑作と思う','これは本当に傑作だ')
,(null,2,null,'これは本当に傑作だ')
,(null,2,null,'これは本当に秀逸だ')
,(null,3,'これは秀逸と思う',null)
,(null,3,'これは秀逸と思う','これは本当に秀逸だ')
,(null,3,'これは傑作と思う','これは本当に秀逸だ')
,(null,3,'これは傑作と思う','これは本当に傑作だ')
,(null,3,null,'これは本当に傑作だ')
,(null,3,null,'これは本当に秀逸だ')
;
◎質問者からの返答

回答、およびご指摘有難うございました。少々質問自体に不備がありました。

改めて質問させてください。


2 ● Galapagos
●50ポイント

本テーブル名を table1, 感想テーブル名を table2 とします。

以下のようになります。

select * from table1, table2 where table1.no = table2.no and (table1.title like '%秀逸%' or table1.desc like '%秀逸%' or table2.title like '%秀逸%' or table2.contents like '%秀逸%');

または、検索対象のカラムだけ取り出したいのであれば、以下のようにしてください。

select table1.title, table1.desc, table2.title, table2.contents from table1, table2 where table1.no = table2.no and (table1.title like '%秀逸%' or table1.desc like '%秀逸%' or table2.title like '%秀逸%' or table2.contents like '%秀逸%');
◎質問者からの返答

回答有難うございました。少々質問自体に不備がありました。

このやり方はわかります。改めて質問させてください。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ