
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
どうか宜しくお願いします。
No.1ベストアンサー
- 回答日時:
こんにちは。
この場合、検索条件が動的(いくつチェックされるかわからない)ですので、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)
などとなります。
No.2
- 回答日時:
まず、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文は、どのような記述になるのか思考錯誤しましたが、解決できませんでした。諦めて現状のままで進めようか、どうしようかと悩んでます。
貴重なアドバイスをいただき、本当にありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【SQL】他テーブルに含まれる値...
-
SQLのテーブルにないデータの出力
-
テーブル名が可変の場合のクエ...
-
SQLで、Join句で結合したテ...
-
指定した年に在籍していた社員...
-
SQLサーバに対するSQL文で抽出...
-
副問合せを使わずにUNIONと同様...
-
結合したテーブルをSUMしたい
-
DB2のSQLコマンドについて
-
Access 別のDBに対してDlookup...
-
ADO+ODBCでテーブルに接続する...
-
テーブルデータの上書きをした...
-
フラグをたてるってどういうこ...
-
truncate tableを使って複数の...
-
SELECT INTOで一度に複数の変数...
-
UPDATEで既存のレコードに文字...
-
オラクルのUPDATEで複数テーブル
-
エラーを起こす方法
-
limit offset はupdate文には使...
-
sqlに記述できない文字
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【SQL】他テーブルに含まれる値...
-
SQLサーバに対するSQL文で抽出...
-
既存データをINSERT文にして出...
-
SQLで、Join句で結合したテ...
-
Accessの構成をコピーしたい
-
結合したテーブルをSUMしたい
-
副問合せを使わずにUNIONと同様...
-
テーブル名が可変の場合のクエ...
-
2つのテーブルをLIKE演算子のよ...
-
ExcelのMatch関数のようなもの...
-
改行を含んだデータのインポート
-
PRIMARY KEYのコピー
-
ADO+ODBCでテーブルに接続する...
-
ACCESSのVBAにてExcelに行...
-
同一テーブル内での比較(最新...
-
(SQL)日数の計算
-
ExcelのVLOOKUP関数の動作をMyS...
-
データ無し時は空白行にしたい...
-
必要なテーブルの個数について。
-
複数選択か?単数選択か? テ...
おすすめ情報