MySQLで以下のテーブル構成の場合、「会社員」かつ「男」のデータを抽出するには、どういうWHERE文を書けばよいのでしょうか?


[id][items]
1 会社員
1 男
2 会社員
2 女
3 自営業
3 男


表示して欲しい検索結果は以下の通りです。

[id][items]
1 会社員
1 男


※idはひとつのグループとします。
※HTMLのフォームから送信されることを想定しています。(選択箇所は「職業」「性別」)
 ですので、id='1' と言うようにidをフォームから指定できません。

MySQLは4.1.22を使っています。

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

回答1件)

id:Catfish No.1

回答回数25ベストアンサー獲得回数4

ポイント60pt

SQLiteでテストし、MySQLでテストしていないですが、以下の構文で抽出出来ると思います。

・会社員で抽出したデータと男で抽出したデータと元のデータベースで検索を行います。

試してみてください。


データベース名を"DataBase"とします。


select DataBase.id, DataBase.items

from DataBase,

(select id, items from DataBase where items="会社員") T1,

(select id, items from DataBase where items="男") T2

where T1.id = T2.id and DataBase.id=T1.id

id:kt26

回答ありがとうございます。

理屈としては「一致するデータのIDを取得し、照合」と言うことですよね?


ただ、フォームが「職業」「性別」以外にある場合、上記のソースだと対応出来ないと思います。

複数項目対応させるには、やはりPHPを使って分解するしかないのでしょうか。


もし他のやり方をご存じの方がいらっしゃいましたら、回答お願いします。

2008/07/01 17:36:18
  • id:Catfish
    フォームの分だけFrom以下の検索テーブルを増やせば可能です。


    select DataBase.id, DataBase.items

    from DataBase,

    (select id, items from DataBase where items="会社員") T1,

    (select id, items from DataBase where items="男") T2,

    (select id, items from DataBase where items="東京都") T3

    where T1.id = T2.id and T1.id = T3.id and DataBase.id=T1.id


    のように、所在地の検索も追加可能です。


    実在のテーブルの代りに、セレクト文の結果をテーブルとして利用します。
    検索するフォームの個数が動的である場合は、プログラミングしてSQL文をいじるしかないと思います。

  • id:kt26
    コメントありがとうございます。

    >検索するフォームの個数が動的である場合は、プログラミングしてSQL文をいじるしかないと思います。

    動的を想定しているので、やはりSQL文だけでは難しいですね。
    やり方・考え方は非常に参考になりました。ありがとうございました。
  • id:Catfish
    質問が、どういうWHERE文を書けばよいかということだったので、Where文での対応に書き換えてみました。

    <code>
    select
    DataBase.id,
    DataBase.items
    from
    DataBase
    where
    id in (select
    T1.id
    from
    (select id, items from DataBase where items="会社員") T1,
    (select id, items from DataBase where items="男") T2,
    (select id, items from DataBase where items="東京都") T3
    where
    T1.id = T2.id and T1.id = T3.id )
    </code>


    "DataBase"を"会社員"で検索した結果を"T1"テーブルとします。
    "DataBase"を"男"で検索した結果を"T2"テーブルとします。
    "DataBase"を"東京都"で検索した結果を"T3"テーブルとします。
    "T1"、"T2"、"T3"のテーブル全てで一致するIDを抽出します。
    "DataBase"から抽出したIDと一致するレコードを取り出して終了です。


    Where以下のセレクト結果が複数有る場合のために、"="から"in"に変更しました。


    個人的には、個別にViewを作成してから検索した方がスマートな気もします。
  • id:kt26
    再度ありがとうございます。こちらも参考にさせていただきます。

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

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

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

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