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

MySQLについて質問です。

以下のようなテーブルがあるとします。

(member テーブル)
人名 | 特徴
-----------------
太郎 | 男
太郎 | A型
次郎 | 男
次郎 | O型
花子 | 女
花子 | O型

このとき、「男」を探すときは 「select * from member where 特徴 = "男"」でいいのですが、「男」かつ「O型」を探すときはどう書けばいいんでしょうか?
単純にandではダメなので、orで重複を処理するのかな?と考えているのですが・・・・

この例だとテーブル構成を変えればいいのはわかりますが、今学習中のものにあわせてテーブル構成はこのままでお願いします。


●質問者: sora_taro
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:A型 MySQL O型 SELECT ダメ
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● masa138
●27ポイント
SELECT m1.名前, m1.特徴, m2.特徴
FROM member m1
LEFT OUTER JOIN member m2 ON (m1.名前 = m2.名前)
WHERE m1.特徴 = '男' AND m2.特徴 = 'O型';

でどうでしょう?

◎質問者からの返答

ありがとうございます!

同じテーブルでも名前をつけて別のテーブルのように扱えばいいんですね。


2 ● chuken_kenkou
●27ポイント

MySQLの質問をする場合、バージョンを明記しましょう。

次のように、SQL周辺だけでも機能的に大きな違いがあります。

MySQL 4.0以前・・・一部のjoin、union、一時表などは使用可能

MySQL 4.1・・・サブクエリの実装、joinの拡張、unicodeなどの実装

mySQL 5.0・・・ビュー、ストアドプロシジャ、トリガなどの実装


「人名」だけ得られればいいなら、例えばこんな感じ。

select
 人名
 from member
 where 特徴 in('男','O型')
 group by 人名
 having count(distinct 特徴)=2 

inと「group by+having」を使ったやり方が、

  1. 「特徴の個数が、2個と固定でない」、
  2. 「指定(in句)した特徴のうち、何個以上持っているか(having句)」

といった場合もあるなら活用しやすいと思います。


「特徴」も得たいなら、上記クエリをサブクエリとしたり、自己結合したりといった方法になります。

select
 * 
 from member
 where 人名 in(select
            人名
           from member
           where 特徴 in('男','O型')
           group by 人名
            having count(distinct 特徴)=2 
 )
◎質問者からの返答

MySQLのバージョンは5.0です。

以後同様の質問をすることがあれば気をつけたいと思います。

ご指摘ありがとうございました。

今やっていることは「人名」だけ得られればいいので

select

人名

from member

where 特徴 in('男','O型')

group by 人名

having count(distinct 特徴)=2

でうまいこといきました。

また、特徴の個数は増える可能性があるので「having count(distinct 特徴)=2」が使えそうです。

ところで、「特徴 in('男','O型')」の部分ですが、これだと「男の子」や「男性」はヒットしないですよね。

likeのようにあいまいな検索はできないのでしょうか?


3 ● chuken_kenkou
●26ポイント

ところで、「特徴 in('男','O型')」の部分ですが、これだと「男の子」や「男性」はヒットしないですよね。

likeのようにあいまいな検索はできないのでしょうか?

「in」は「or」に展開できますから、「or」にすればlikeや正規表現を使えます。

しかし、likeなどであいまい検索する場合、前方一致といった条件でないと、母体データ件数にもよりますが、性能を出せません。


また、同じ意味を持つ値が多数存在するのも問題です。

例えば、「特徴」に「性格」を表すようなデータがあった場合、「男勝り」などがあったら、区別するのに冗長な検索条件が必要になってしまいます。

「性別」と「血液型」だけだったとしても、「男」を表すのは、「男」で始まらない「少年」なども考えられます。

いずれにしてもちゃんと正規化したり、具体的な要件が見えないと、行き当たりばったりになってしまいます。

関連質問


●質問をもっと探す●



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