テーブル結合の後に多重ソート

このQ&Aのポイント
  • mysql 4.1.21 を使用して、テーブル結合の後に複雑なルールでソートを行いたいです。結合条件は shop_id で行い、ソート条件は end_date の過ぎたデータを優先し、news_title の有無や image の値でソートします。
  • 現在の SQL では end_date の条件指定がうまくいかず、フラグカラムを作成する方法など検討中です。他に簡単な方法があれば教えていただきたいです。
  • 希望する結果は、テーブルA とテーブルB を shop_id で結合し、image の値が降順で、news_title が存在するデータを優先で表示します。end_date の過ぎたデータは image が '0' で news_title が空と同等として扱います。
回答を見る
  • ベストアンサー

テーブル結合の後に多重ソート

複雑なルールで結合とソートをしたいのですが、可能でしょうか? mysql 4.1.21 です。 テーブルA shop_id | name | adress テーブルB shop_id | news_title | end_date |image| 上記テーブルをshop_id でleft joinで結合します。 その後ソートをする条件は まずend_date が過ぎているものは、news_titleや imageに何か入っていても、入っていないことにする。 次にテーブルBのnews_title に文字が入っていれば上位にソートされ さらにテーブルBのimageは1か0の数字が入っていて、1が上位にソートされる。 end_date の条件指定する部分で方法が見つかりません。 end_date の条件を無視すると下記sql で希望する結果が得られています。 select shop_id,shop_name from テーブルA left join テーブルB on テーブルA.shop_id = テーブルB.shop_id order by image desc,news_title <>'' desc です。 end_date が過ぎているものは image = '0' ,news_title ='' と同じことになります。 結合する時に、if文で判定してフラグカラムを作るなんて無理でしょうか?他に思いつく方法が無いのですが、、、 どなたかご教授お願いします。

  • MySQL
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
回答No.1

ソート用に一時的にフラグ列を設けてもいいし、ORDER BYで直接指定することも可能です。 なお、ORDER BYで一時的な列や式を指定した場合、インデクスがあっても利用されませんので注意してください。 【SQL例1】CASEを使用 select A.shop_id,shop_name,image,news_title,end_date,news_title<>'' from A left join B on A.shop_id = B.shop_id where A.shop_id=1 order by case when end_date<'2007-01-09' then 0 else image end desc, case when end_date<'2007-01-09' then 0 else news_title<>'' end desc ; 【SQL例2】IFを使用 select A.shop_id,shop_name,image,news_title,end_date,news_title<>'' from A left join B on A.shop_id = B.shop_id where A.shop_id=1 order by if(end_date<'2007-01-09',0,image) desc, if(end_date<'2007-01-09',0,news_title<>'') desc ;

miyury
質問者

お礼

色々調べていたら、データの登録のされ方に問題がありました。 データを修正しましたら解決いたしました。 有難うございました。

miyury
質問者

補足

ご回答有難うございます。 教えていただいたソースで、出来ました。 cace や if が使えると、幅がひろがりますね。 勉強になりました。 ただ、もともと私が出来ていたと思っていたソートが 実は希望の結果になっていない事が判明したのです。 end_date を 条件から外しソートする基準は image ='1'および、news_titleは<>''のデータが上位に来て 次に、image ='1' news_titleは='' のデータ次に image ='0' news_title='' のデータの順でソートしたいのです。 ソートの条件が複数あるということです。 image ='1'をまず、ソートしてしまうと、 news_titleのカラムは <>'' や='' が揃わない状態でソートされます。逆にnews_title <>''を先にソートすると image ='1'のデータが上位にはきません。 この辺の方法はあるのでしょうか? 宜しくお願いします。

関連するQ&A

  • テーブルを結合

    テーブルの結合に関して質問します。 ネットなどでinner joinを使った複数のテーブル結合が参考として 書いてあったのですが(3つまで), 4つテーブルを結合する事は 出来るのでしょうか? A,B,CテーブルにはID,NAMEがあります。 DテーブルにはA,B,CテーブルのIDがあります。 参考サイトを見て3つのテーブルを結合するSQLが以下になります。 SELECT a.name, b.name, c.name FROM a INNER JOIN (b INNER JOIN c ON b.id = c.id) ON a.id = c.id よろしければアドバイスお願いします。

  • 固定値を含む結合と複数テーブルの結合について

    「1.固定値を含む結合」と「2.複数テーブルの結合」について教えて下さい。 最近oracleを使い始めてSQLで表の結合を書く場面があるんですが LEFT(RIGHT) JOIN を使うのか、(+)を使って書くのかで迷っています。 LEFT(RIGHT) JOINだと固定値を含めて外部結合しようとするとエラーになってしまいます。 それが嫌で(+)を使っていたんですが 今度は複数のテーブルを(+)で結合しようとするとエラーになってしまいます。 (AテーブルとBテーブル、AテーブルとCテーブルなど?) こういう場合はどうすれば良いのでしょうか? とりあえず副参照をFROMに指定して対処してるんですが 何かきちんとした書き方があるのでしょうか?誰か教えて下さい。

  • 3つのテーブルの処理について

    下記のようなテーブルがあったとして、 テーブルAを基準に考えたいのですが、、、、 テーブルAに付加する形でテーブルBのデータのidカウント数が最も少なく、idが同じもの中でdate日が一番新しいデータを表示し、古いものから並べかえかつテーブルCにidがあるものは一番最後にくるという風に並べかえたいのですが、無理でしょうか? 現在下記のようなSQLを考えていますが、うまくいかないです。。 select * from A left join(select id,case when count(id)=0 then 0 else count(id) end AS cnt FROM B group by id order by date) as b on A.id=b.id left join(select id from C) as c on A.id=c.id order by c.id desc,b.cnt; エラー↓ in the GROUP BY clause or be used in an aggregate function テーブルA id | name | comment| 1 あ   おい 2 い   えい 3 か   テス テーブルB id | event | date | 1 test1 2005/1/4 2 test1 2005/1/4 1 test2 2005/3/4 2 test2 2005/3/4 1 test3 2005/5/4 テーブルC id | 1 理想の結合データ id | name | comment| cnt | date | 3 か   テス 0    2 い   えい 2  2005/3/4  1 あ   おい 3 2005/5/4

  • 違うDB間のテーブル結合について

    宜しくお願い致します。 同じDB内にあるテーブル同士はleft join等で結合できますが、違うDB間にあるテーブルを結合する事は可能でしょうか?

    • ベストアンサー
    • MySQL
  • 同じ構成のテーブルを結合する

    AとBという全く同じ列構成からなるテーブルの結合を考えています。 イメージとしては、Aのレコードが全て表示された下にBのレコードが列挙されるような感じです。 "INNER JOIN"、"LEFT OUTER JOIN"で行った結果、AとBでキーに同じ値を持つと、どちらかの値で上書きされてしまうみたいなのでイメージ通りにはいきませんでした。また、"CROSS JOIN"ではAの右側にBの内容が追加されてしまうのもあって、イメージ通りにできませんでした。 どなたかこのSQL文が分かる方はお教えいただけないでしょうか? よろしくお願いします。 データベース:SQL Server

  • 3テーブル外部結合方法について

    3つのテーブルを外部結合したいのですが・・・、 こんがらがってしまいました。 A,B,Cの3テーブルがあり、A,B,Cの順に外部結合 (LEFT OUTER JOIN)したいのですが、 A,BのテーブルについてはWhere句の条件指定が 必要です。 Select From (Select AA.a From A AA Where b = xxxx) BB Left Outer Join (Select CC.b From B CC Where c = eeee and BB.a = CC.b) On ???? こんな感じでつまづいてしまいました・・・

  • テーブル結合の条件指定について

    以下のようなテーブルが3つある場合に2つのテーブルにあるポイントを合計して取得したいと思っています。 ただ、外部結合しているtable_cに条件を与えるとうまく取得できません。 table_cにcdがある場合は条件を指定し、 ない場合は条件を指定しないようにするにはどうすればいいのでしょうか。 【table_a】 id    name ------------------ a1    aaa a2    bbb a3    ccc 【table_b】 b_id     a_id   user_id    point --------------------------------- b1     a1    00001    5 b2     a1    00002    2 b3     a3    00007    10 b4     a2    00356    10 【table_c】 c_id    user_id    cd     bonus_point ------------------------------------------------ c1     00001    cd_1    1 c2     00007    cd_2    1 c3     00356    cd_1    1 SELECT table_b.user_id as user_id , (ifnull(table_b.age_count) + ifnull(table_c.bonus_point, 0)) as total_point FROM table_a INNER JOIN table_b ON (table_b.a_id=table_a.a_id)    LEFT JOIN table_c ON (table_c.user_id=table_b.user_id) WHERE table_c.cd = 'cd_1' ORDER BY total_point desc ■結果 user_id    total_point ----------------------------- 00356     11 00001      6 ■求めたい結果 user_id    total_point ----------------------------- 00356     11 00001      6 00002     2 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • テーブル結合について

    テーブルの結合についてお聞きしたいことがあります。 カラム「KEY」を結合条件に テーブルA、B、Cを結合して【取りたい結果】のようなデータを取りたいと思っています。 しかし、テーブルAにBとCをLEFT JOINを結合した所、 【取得された結果】のデータが取得されました。 どのような結合をしたら期待通りの結果が得られるのでしょうか? 回答宜しくお願いします。 【取得された結果】 key dataA dataB dataC ------------------------------------------------- 1 A-1 B-1 C-1 A-1 B-1 C-2 A-1 B-1 C-3 2 A-2 3 A-3 【取りたい結果】 key dataA dataB dataC ------------------------------------------------- 1 A-1 B-1 C-1 A-1 C-2 A-1 C-3 2 A-2 3 A-3 【テーブルA】 key dataA --------------------- 1 A-1 2 A-2 3 A-3 【テーブルB】 key dataB --------------------- 1 B-1 【テーブルC】 key dataC --------------------- 1 C-1 1 C-2 1 C-3

  • 集計されたテーブルの結合

    SUM、AVGなどで集計された(group byを使って)テーブルを、LEFT JOINで結合するにはどうしたらいいですか?

    • ベストアンサー
    • MySQL
  • テーブルの結合・・・

    教室テーブル id, class 1, A組 2, B組 3, C組 生徒テーブル id, name 1, 佐藤 1, 山田 2, 鈴木 3, 田中 3, 後藤 3, 加藤 という二つのテーブルがあります。 これらをLEFT JOINで結合したのですが。 A組, 佐藤 A組, 山田 B組, 鈴木 C組, 田中 C組, 後藤 C組, 加藤 となってしまいます。 これを同じ教室名でまとめて、 A組, 佐藤 山田 B組, 鈴木 C組, 田中 後藤 加藤 というように表示したいのです。 できればクエリだけで解決したいのですが・・・ よろしくお願いします。

    • ベストアンサー
    • MySQL