• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:テーブル結合の後に多重ソート)

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

この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 が空と同等として扱います。

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

  • ベストアンサー
回答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