以下のようなテーブルがあるとします。
(member テーブル)
人名 | 特徴
-----------------
太郎 | 男
太郎 | A型
次郎 | 男
次郎 | O型
花子 | 女
花子 | O型
このとき、「男」を探すときは 「select * from member where 特徴 = "男"」でいいのですが、「男」かつ「O型」を探すときはどう書けばいいんでしょうか?
単純にandではダメなので、orで重複を処理するのかな?と考えているのですが・・・・
この例だとテーブル構成を変えればいいのはわかりますが、今学習中のものにあわせてテーブル構成はこのままでお願いします。
SELECT m1.名前, m1.特徴, m2.特徴 FROM member m1 LEFT OUTER JOIN member m2 ON (m1.名前 = m2.名前) WHERE m1.特徴 = '男' AND m2.特徴 = 'O型';
でどうでしょう?
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」を使ったやり方が、
といった場合もあるなら活用しやすいと思います。
「特徴」も得たいなら、上記クエリをサブクエリとしたり、自己結合したりといった方法になります。
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のようにあいまいな検索はできないのでしょうか?
ところで、「特徴 in('男','O型')」の部分ですが、これだと「男の子」や「男性」はヒットしないですよね。
likeのようにあいまいな検索はできないのでしょうか?
「in」は「or」に展開できますから、「or」にすればlikeや正規表現を使えます。
しかし、likeなどであいまい検索する場合、前方一致といった条件でないと、母体データ件数にもよりますが、性能を出せません。
また、同じ意味を持つ値が多数存在するのも問題です。
例えば、「特徴」に「性格」を表すようなデータがあった場合、「男勝り」などがあったら、区別するのに冗長な検索条件が必要になってしまいます。
「性別」と「血液型」だけだったとしても、「男」を表すのは、「男」で始まらない「少年」なども考えられます。
いずれにしてもちゃんと正規化したり、具体的な要件が見えないと、行き当たりばったりになってしまいます。
ありがとうございます!
同じテーブルでも名前をつけて別のテーブルのように扱えばいいんですね。