重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

MYSQL5.0 SQLについて教えて下さい。

会員検索のページを作成していますが、どのように書いたらよいのか分からない検索条件の
SQLを教えて欲しいのです。

テーブル(USER_TBL)には、ユーザーID(USER_ID)、趣味1(SYU1)、趣味2(SYU2)、趣味3(SYU3)、趣味4(SYU4)、趣味5(SYU5)
の列があります。ユーザーIDは会員の各会員のIDを表しています。趣味の1~5は、趣味の種類で、それぞれ「0」か「1」の値が格納されています。
ちなみに「1」が趣味ありという意味です。

USER_TBL
--------------------------
USER_ID CHAR(5),
SYU1 SMALLINT,
SYU2 SMALLINT,
SYU3 SMALLINT,
SYU4 SMALLINT,
SYU5 SMALLINT

検索画面には趣味1~5のチェックボタンを用意します。(複数選択可)
画面でチェックした趣味と一つでも合致する会員を対象に
趣味が合致する数が多い順に3名を抽出するSELECT文を教えて下さい。


(例)テーブル(USER_ID)の全会員の中で趣味1か趣味2か趣味3か趣味5が「1」の会員を対象に
趣味1~3と趣味5の合計が大きい順に3名をSELECTする。

USER_TBL
----------------------
USER_ID SYU1 SYU2 SYU3 SYU4 SYU5
00001 0 0 0 1 0
00002 0 0 0 0 1
00003 1 1 0 1 1
00004 1 1 1 1 1
00005 0 0 1 1 1

画面(検索条件)
----------------------
趣味1 ?
趣味2 ?
趣味3 ?
趣味4
趣味5 ?


結果
----------------------
USER_ID SYU1 SYU2 SYU3 SYU4 SYU5
00004 1 1 1 1 1
00003 1 1 0 1 1
00005 0 0 1 1 1



どうか宜しくお願いします。

A 回答 (2件)

こんにちは。



この場合、検索条件が動的(いくつチェックされるかわからない)ですので、SQLも動的になってしまいますが、それでもOKですか?

例えば・・・、
SELECT USER_ID, SYU1, SYU2, SYU3, SYU4, SYU5,
SUM(ここが動的) AS 一致した数
FROM USER_TBL
ORDER BY 一致した数 DESC
LIMIT 3

この動的な部分ですが、例えば画面でSYU1, SYU2, SYU3, SYU5の4つがチェックされている場合、
SUM(SYU1+SYU2+SYU3+SYU5)
などとなります。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。希望通りの結果になりました。諦めかけていただけにすごく嬉しいです。本当にありがとうございました。

お礼日時:2010/07/24 03:48

まず、SQLとしてはご提示のような冗長なテーブルを作ることはありません。



理由は3つ。
1つは拡張性の問題として趣味1~5が絶対に増えないという条件が必要になるからです。
もう1つは、趣味ではないデータは持つ必要がないため、無駄がおおくなるからです。
最後に、構造上検索性が非常にわるいからです。

可能性としては、USER_IDとSYUの組合せを持つテーブルを作るのが妥当ですね。

USER_ID,SYU
00001 SYU4
00002 SYU5
00003 SYU1
00003 SYU2
00003 SYU4
00003 SYU5
00004 SYU1
00004 SYU2
00004 SYU3
00004 SYU4
00004 SYU5
00005 SYU3
00005 SYU4
00005 SYU5

というデータの持ち方をするのがSQL的ですね。

もしどうしてもご提示の方法がよいのであればORDER BYでSUMしたものをDESCして
LIMITで上限をとればよいでしょう。(お勧めはしないですけど)

SELECT USER_ID,SYU1,SYU2,SYU3,SYU4,SYU5
FROM USER_TBL
WHERE SYU1=1 AND SYU2=1 AND SYU3=1
ORDER BY SUM(SYU1+SYU2+SYU3+SYU4+SYU5) DESC
LIMIT 3
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。残念ながら、教えていただいたSQLを実行したところ、なぜか1件のみの表示となってしまい思考錯誤しましたが、希望通りにはなりませんでした。
ですが、ご親切に教えていただいて嬉しく思います。
アドバイスをいただいたテーブルの構造ですが、非常に勉強になりました。
ただ、各会員のユーザーIDと新しく作成する趣味テーブル(USER_IDとSYUの組合せを持つテーブル)を紐づけてのSQL文は、どのような記述になるのか思考錯誤しましたが、解決できませんでした。諦めて現状のままで進めようか、どうしようかと悩んでます。
貴重なアドバイスをいただき、本当にありがとうございました。

お礼日時:2010/07/24 04:10

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す