MySQLについて質問です。


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

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

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

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

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

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

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

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

回答の条件
  • 1人2回まで
  • 13歳以上
  • 登録:2011/02/18 07:49:29
  • 終了:2011/02/21 14:13:29

ベストアンサー

id:chuken_kenkou No.1

chuken_kenkou回答回数722ベストアンサー獲得回数542011/02/18 11:05:15

ポイント50pt

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,'これは本当に秀逸だ')
;
id:ruijio

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

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

2011/02/21 14:13:01

その他の回答(1件)

id:chuken_kenkou No.1

chuken_kenkou回答回数722ベストアンサー獲得回数542011/02/18 11:05:15ここでベストアンサー

ポイント50pt

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,'これは本当に秀逸だ')
;
id:ruijio

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

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

2011/02/21 14:13:01
id:Galapagos No.2

Galapagos回答回数963ベストアンサー獲得回数892011/02/18 12:27:43

ポイント50pt

本テーブル名を 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 '%秀逸%');
id:ruijio

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

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

2011/02/21 14:12:58

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません