テーブル結合の後に多重ソート
- 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文で判定してフラグカラムを作るなんて無理でしょうか?他に思いつく方法が無いのですが、、、 どなたかご教授お願いします。
- miyury
- お礼率50% (5/10)
- MySQL
- 回答数1
- ありがとう数1
- みんなの回答 (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 ;
関連する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 よろしければアドバイスお願いします。
- ベストアンサー
- Oracle
- 固定値を含む結合と複数テーブルの結合について
「1.固定値を含む結合」と「2.複数テーブルの結合」について教えて下さい。 最近oracleを使い始めてSQLで表の結合を書く場面があるんですが LEFT(RIGHT) JOIN を使うのか、(+)を使って書くのかで迷っています。 LEFT(RIGHT) JOINだと固定値を含めて外部結合しようとするとエラーになってしまいます。 それが嫌で(+)を使っていたんですが 今度は複数のテーブルを(+)で結合しようとするとエラーになってしまいます。 (AテーブルとBテーブル、AテーブルとCテーブルなど?) こういう場合はどうすれば良いのでしょうか? とりあえず副参照をFROMに指定して対処してるんですが 何かきちんとした書き方があるのでしょうか?誰か教えて下さい。
- ベストアンサー
- Oracle
- 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
- ベストアンサー
- PostgreSQL
- 違う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
- 締切済み
- Oracle
- テーブルの結合・・・
教室テーブル 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
お礼
色々調べていたら、データの登録のされ方に問題がありました。 データを修正しましたら解決いたしました。 有難うございました。
補足
ご回答有難うございます。 教えていただいたソースで、出来ました。 cace や if が使えると、幅がひろがりますね。 勉強になりました。 ただ、もともと私が出来ていたと思っていたソートが 実は希望の結果になっていない事が判明したのです。 end_date を 条件から外しソートする基準は image ='1'および、news_titleは<>''のデータが上位に来て 次に、image ='1' news_titleは='' のデータ次に image ='0' news_title='' のデータの順でソートしたいのです。 ソートの条件が複数あるということです。 image ='1'をまず、ソートしてしまうと、 news_titleのカラムは <>'' や='' が揃わない状態でソートされます。逆にnews_title <>''を先にソートすると image ='1'のデータが上位にはきません。 この辺の方法はあるのでしょうか? 宜しくお願いします。