• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:MYSQL5.0 SQLについて教えて下さい。)

MYSQL5.0 SQLの会員検索条件の書き方

このQ&Aのポイント
  • 会員検索のページで使用するMYSQL5.0 SQLの書き方について教えてください。
  • テーブル(USER_TBL)には、ユーザーID、趣味1~5の列があります。検索画面では趣味1~5のチェックボタンを用意し、選択された趣味と一致する会員を3名抽出するSELECT文を教えてください。
  • SELECT文では、各趣味の値が「1」かつ合致する数が多い順に3名を抽出する必要があります。

質問者が選んだベストアンサー

  • ベストアンサー
回答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) などとなります。

yanagihk
質問者

お礼

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

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答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

yanagihk
質問者

お礼

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

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • SQLの条件検索について

    下記のような「果物TBL」というテーブルがあるとします。 果物TBL -------------------------------- ID    名前      値段 - - - - - - - - - - - - - - - - - - - - 01    りんご     150 02    バナナ     250 03    みかん     250 04    ぶどう     300 -------------------------------- また上記のテーブルと全く同じ構成の「果物検索TBL」というテーブルがあるとします。 そのテーブルには、例として下記のような値を入れておきます。 果物検索TBL -------------------------------- ID    名前      値段 - - - - - - - - - - - - - - - - - - - - NULL   りんご     250 NULL   バナナ     NULL -------------------------------- この時、下記のようなSQLだと SELECT DISTINCT 果物TBL.名前 FROM 果物TBL INNER JOIN 果物検索TBL ON (果物TBL.ID = 果物検索TBL.ID AND LEN(果物検索TBL.ID) > 0) OR (果物TBL.名前 = 果物検索TBL.名前 AND LEN(果物検索TBL.名前) > 0) OR (果物TBL.値段 = 果物検索TBL.値段 AND LEN(果物検索TBL.値段) > 0); -------------------------------- 名前 - - - - - - - - - - - - - - - - - - - - バナナ みかん りんご -------------------------------- という結果になります。(名前:りんご・バナナと値段:250のOR検索) その結果を -------------------------------- 名前 - - - - - - - - - - - - - - - - - - - - バナナ -------------------------------- という結果にするにはどうすればいいでしょうか?(名前:りんご・バナナと値段:250のAND検索、バナナのみマッチ) 単純にORをANDにしてもうまくいきませんでした。 動的にSQLを作れれば良いのですが、この構成は変えられないのでNULL値がネックになり分かりません。 教えてください。 また、記載してるSQLよりもっとスマートな書き方があれば教えてください。

  • 別テーブルの行数を利用してソートしたい

    MySQLバージョン4.1.16を使用しています。 テーブル「tbl1」をテーブル「tbl2」の「msg」カラムの行数を利用して ソートしたいのですが、どのようなSQL文になるのでしょうか? 以下の例だと、tbl2のuser_idがbbbbのmsg数の方が多いので descで並べるとtbl1はbbbb、aaaaの順になるようにしたいです。 テーブル「tbl1」 +----------+ | user_id   | +----------+ |  aaaa   | +----------+ |  bbbb   | +----------+ テーブル「tbl2」 +----------+---------+ |  user_id  |  msg  | +----------+---------+ |  bbbb   |  ああ  | +----------+---------+ |  aaaa   |  いい  | +----------+---------+ |  bbbb   |  うう   | +----------+---------+ SELECT * FROM tbl1 INNER JOIN tbl2 ON tbl1.user_id = tbl2.user_id ORDER BY (ここの部分が知りたいです、または全く違う文になるのでしょうか?) desc

    • ベストアンサー
    • MySQL
  • SQLのcount()とgroup by

    以下のようなテーブルがあったとき、 tbl1 id | score 1 | 100 1 | 200 1 | 300 2 | 200 2 | 100 3 | 300 3 | 400 3 | 500 3 | 600 idでまとめて個数を出すとすると、 SELECT count(*) FROM tbl1 group by id とすれば count(*) 3 2 4 と結果が返ってきますが、この結果にidを足して id | count(*) 1 | 3 2 | 2 3 | 4 というようなSQLはどうやって書けばいいのでしょうか? MySQLでは、 SELECT id, count(*) FROM tbl1 group by id と書けるのですが、これは標準的なSQLではNGなそうなので、気になって質問しました。 よろしくお願いします。

  • SQL文にて・・・

    質問があります。PostgreSQLです。 テーブル(test_tbl)があるとします。 テーブル構成は --------------------------- id ===== char(16) [英数文字格納] point ==== int2 add_date ==== timestamp --------------------------- このテーブルから idが2文字目から'di6ek68dh5ls7g'のレコードを取得したいと考えています。 レコード数がかなりおおいので パフォーマンスを重視したいのですが、 検索SQLがわかりません。 select * from test_tbl where id like '%di6ek68dh5ls7g'だとでると おもうのですが、 これ以上にパフォーマンスがあがる SQLがわかる方お願いいたします。

  • mysqlのsql文について教えて下さい

    mysqlのsql文について教えて下さい 下記のようなテーブルとデータがあった場合に どうやれば 2,次郎だけを抽出できますか? 本日日付(2010-08-06)が 既にテーブルBにdateが存在する場合は 3,1,2010-08-04 3,1,2010-08-06を 対象外にしたいです。 Aテーブル id,user 1,太郎 2,次郎 3,3郎 Bテーブル targetid,homonid,date(datetime型) 3,1,2010-08-04 3,1,2010-08-06 3,2,2010-08-05 下記だと2010-08-04にヒットしてしまい(当たり前?)動作しません。 select distinct a.* from tblA a, tblB b where date_format(b.date, "%Y-%m-%d") <> "2010-08-06" ;

  • ACCESSのSQLの書き方

    ACCESSでのSQL文の書き方を教えてください。 テーブルtbl_Aとテーブルtbl_Bがあり, tbl_Aで得られた数値とtbl_Bで得られた数値を加えたものを結果として表示します。 どう書けばよろしいのでしょうか。どうしてもエラーになってしまいます。 イメージとしてはこんな感じです。 select (select ~~ from tbl_A where ~~)+(select ~~ from tbl_B where ~~) (もしoracleならば,「from dual」というのを最後に付けるんですが。)

  • phpMyadmin利用してCSV抽出のSQL文

    さくらのレンタルサーバを利用しています そのサーバにあるphpMyadminの利用での質問です phpMyadminの検索機能を利用して特定のレコードをcsvデータとして抽出したいと思います 例えば、テーブルaのid=1000の場合の画面表示は次のSQL文で表示されます ------------------- SELECT * FROM `tbl_a` WHERE `id` =1000 ------------------- パソコン側の保存先が C:\Documents and Settings\users\My Documents\SAKURA_DL" とした場合のSQL文はどのように記載すればいいか教えていただけませんか ちなみに 次のように記載してみたのですがエクスポートされません --------------------------------------------- SELECT * FROM `tbl_a` WHERE `id` =1000 INTO OUTFILE "C:\Documents and Settings\users\My Documents\SAKURA_DL" ---------------------------------------------- よろしくお願いします。

  • PHPでSQLの中にSQLという記述はできますか?

    PHPでログイン画面で入力されたIDからユーザーNOを割り出し、商品テーブルにあるユーザーNOが一致する商品だけを絞り出すSQLを組みたいです。 ユーザーテーブル ユーザーNO、ユーザーID、パスワード 商品テーブル 商品名、ユーザーNO、数量 商品テーブルのsqlのwhereの中に、もうひとつsplをいれるようなことできますか? 例えばユーザーIDがyamadaの検索結果でたユーザーnoで商品テーブルのユーザーnoが一致するものを表示です よろしくお願いします

    • ベストアンサー
    • MySQL
  • SQLについて

    SQLについてです。 「購入情報」というテーブルには販売番号、商品番号、売れた個数が記述されており、 (販売番号,商品番号,売れた個数)=(a101,1000,2),(a101,1001,2),(a102,1003,2), (a102,1000,4),(a102,1002,2),(a103,1003,1) 「購入者情報」というテーブルには販売番号、ユーザーID、買ったお店が記述されており、 (販売番号,ユーザーID,価格) = (a101,u1,tokyo),(a102,u2,yokohama),(a103,u3,chiba) 「会員情報」というテーブルにはユーザーID、名前が記述されており、 (ユーザーID,名前) = (u1,yamada),(u2,takahashi),(u3,yamamoto) ここから、同時に商品を3種類以上購入したユーザーの名前を求めるために下記のSQL文を考えました。 (SELECT 販売番号, COUNT(*) FROM 購入情報 GROUP BY 販売番号SalesCode Having COUNT(*) >= 3) UNION (SELECT 会員情報.名前 FROM 会員情報, 購入者情報, 購入情報 WHERE 購入情報.販売番号 = 購入者情報.販売番号 AND 購入者情報.ユーザーID = 会員情報.ユーザーID); うまくできません。 どう直したらうまくいくでしょうか。 初心者なので、わかりやすく教えていただきたいです。 よろしくお願いいたします。

  • 得られたカラムを利用して複数行を1文で取得したい

    MySQLバージョン4.1.16を使用しています。 テーブル「tbl1」のnoが2が保有しているuser_id(この場合はaaaa) の行を1つのSQL文で取得したいのですが、どのようなSQL文なるでしょうか? 例えばこの場合は1,2,4行目が取得できるようにしたいです。 また、PHPなどを利用して記述する場合に、 一旦、 select * from tbl1 where no = '2'; で得られたuser_id(aaaa)を変数に保存しておき、 それを利用してもう一度 select * from tbl1 where user_id = '{上のSQL文で得られた変数(中身はaaaa)}'; と二度記述してもできるのでしょうが、 初めの1つのSQL文で取得する場合と、2つのSQL文わけて取得する場合とでは 件数が多くなっていった時にどちらが早い遅いというのはあるのでしょうか? テーブル「tbl1」 +----------+---------+ |  user_id  |  no   | +----------+---------+ |  aaaa   |   1   | +----------+---------+ |  aaaa   |   2   | +----------+---------+ |  bbbb   |   3   | +----------+---------+ |  aaaa   |   4   | +----------+---------+

    • ベストアンサー
    • MySQL