MySQLについて質問です。


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

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

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

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

回答の条件
  • 1人3回まで
  • 登録:
  • 終了:2008/12/29 20:18:12
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答3件)

id:masa138 No.1

回答回数9ベストアンサー獲得回数0

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

でどうでしょう?

id:sora_taro

ありがとうございます!

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

2008/12/22 21:51:29
id:chuken_kenkou No.2

回答回数722ベストアンサー獲得回数54

ポイント27pt

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 
                      )
id:sora_taro

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

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

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

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

select

人名

from member

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

group by 人名

having count(distinct 特徴)=2

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

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

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

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

2008/12/22 22:01:27
id:chuken_kenkou No.3

回答回数722ベストアンサー獲得回数54

ポイント26pt

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

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

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

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


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

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

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

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

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

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

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

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

回答リクエストを送信したユーザーはいません