SQLについて教えて下さい


tableA
code,name
1,aさん
2,bさん
3,cさん
4,dさん
5,eさん

tableB
code,mode,add
1,e,東京都
1,e,大阪府
1,e,愛知県
1,e,宮城県
1,e,福岡県
1,h,長野県
1,h,大阪府
1,s,大阪府
2,e,千葉県
2,s,大阪府
2,h,大阪府
3,e,大阪府
3,h,東京都
4,e,北海道
4,e,愛知県
4,h,東京都
5,e,東京都
5,e,愛知県

上記のテーブルから「add」を「大阪府」で検索した場合、
下記のような表示をしたい場合のSQL(MySQL4.x)を教えてください。

aさん,e,h,s
bさん, ,h,s
cさん,e, ,

よろしくお願いします。

回答の条件
  • 1人1回まで
  • 登録:
  • 終了:2008/02/06 19:20:02
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答1件)

id:zebevogue No.1

回答回数65ベストアンサー獲得回数7

ポイント60pt

上記の条件だけでやってみました。

SELECT

tableA.name AS name,

CASE WHEN SUM(CASE tableB.mode WHEN 'e' THEN 1 ELSE 0 END) > 0 THEN 'e,' ELSE ',' END ||

CASE WHEN SUM(CASE tableB.mode WHEN 'h' THEN 1 ELSE 0 END) > 0 THEN 'h,' ELSE ',' END ||

CASE WHEN SUM(CASE tableB.mode WHEN 's' THEN 1 ELSE 0 END) > 0 THEN 's' ELSE '' END AS mode

FROM tableA LEFT JOIN tableB ON tableA.code = tableB.code

WHERE tableB.`add` = '大阪府'

GROUP BY tableA.name

CASE文が多くなるのが難点ですが。

  • id:chuken_kenkou
    tableBの行を一意に識別できるキー、順序を定められるキーがないのが気になりますが。。。

    >|
    select
    `name`,`mode`
    from tableA
    inner join tableB
    on tableA.`code`=tableB.`code`
    where `add`='大阪府'
    order by tableA.`code`
    |<
  • id:worldtravel
    すいません。

    aさん,e
    aさん,h
    aさん,s
    bさん,s
    bさん,h

    というように表示されますよね!?


    この先は、phpでやると言う事ですか?
    (phpは例としてです)


    aさん,e,h,s
    bさん, ,h,s

    というようにSQLだけでできないでしょうか?
    大量のデータの中から、例えば30〜40件目を表示したいので、
    とりあえず全て上記のコードで検索して、
    そのあと30〜40件目を抜き出すのでは大変な気がします。

    何とかできないのでしょうか?

    よろしくお願いします。
  • id:zebevogue
    補足です、カラムを分けるなら、
    END ||
    の部分を
    END,
    としてください。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません