- ベストアンサー
MYSQL5.0 SQLの会員検索条件の書き方
- 会員検索のページで使用するMYSQL5.0 SQLの書き方について教えてください。
- テーブル(USER_TBL)には、ユーザーID、趣味1~5の列があります。検索画面では趣味1~5のチェックボタンを用意し、選択された趣味と一致する会員を3名抽出するSELECT文を教えてください。
- SELECT文では、各趣味の値が「1」かつ合致する数が多い順に3名を抽出する必要があります。
- みんなの回答 (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) などとなります。
その他の回答 (1)
- yambejp
- ベストアンサー率51% (3827/7415)
まず、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
お礼
ご回答ありがとうございました。残念ながら、教えていただいたSQLを実行したところ、なぜか1件のみの表示となってしまい思考錯誤しましたが、希望通りにはなりませんでした。 ですが、ご親切に教えていただいて嬉しく思います。 アドバイスをいただいたテーブルの構造ですが、非常に勉強になりました。 ただ、各会員のユーザーIDと新しく作成する趣味テーブル(USER_IDとSYUの組合せを持つテーブル)を紐づけてのSQL文は、どのような記述になるのか思考錯誤しましたが、解決できませんでした。諦めて現状のままで進めようか、どうしようかと悩んでます。 貴重なアドバイスをいただき、本当にありがとうございました。
お礼
ご回答ありがとうございました。希望通りの結果になりました。諦めかけていただけにすごく嬉しいです。本当にありがとうございました。