MySQLについて質問です。


データ保存用のテーブル(a_table)に「category1」と「category2」のフィールドがあるとします。
カテゴリ用テーブルには「category_id」と「cate_name」のフィールドがあるとします。

1つのカテゴリを対象とする時は
SELECT category.cate_name FROM a_table INNER JOIN category ON a_table.category1=category.category_id

とすれば、category1の表示名をcategoryテーブルから読み込むことが出来ます。


では、category1とcategory2をcategoryテーブルと結合して表示するにはどうすればいいのでしょうか?
categoryテーブルを2つ結合する方法以外でありましたら、教えていただければと思います。
(MySQLは4.1.22を利用しています)

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

回答1件)

id:b-wind No.1

回答回数3344ベストアンサー獲得回数440

ポイント60pt

category1とcategory2をcategoryテーブルと結合して表示する

結果をどのように表示するかによりますね。


プログラムでの並び替えも含めてよければ、

SELECT category.cate_name
  FROM a_table INNER JOIN category
  WHERE a_table.category1 = category.category_id
     OR a_table.category2 = category.category_id

でも何とかなります。

id:kt26

これだと、「category1とcategory2のどちらかがcategory_idに含まれていれば表示する」

であり、category1とcategory2の表示名を出せないです。


あくまでもやりたいことは

category1=>categoryテーブルから一致するcate_nameを表示

category2=>categoryテーブルから一致するcate_nameを表示


を1つのSQLで行い、結果として出力されればと思います。

(つまり、一致するcate_nameが2つ表示される)

2008/01/08 12:13:23
  • id:mj99
    普通に書くなら、

    SELECT
    t.category1, c1.category_name AS category_name1
    ,t.category2, c2.category_name AS category_name2
    FROM a_table AS t
    INNER JOIN category AS c1 ON t.category1 = c1.category_id
    INNER JOIN category AS c2 ON t.category2 = c2.category_id
    (場合によってはJOINはLEFT OUTERか)

    ----
    質問文に
    >categoryテーブルを2つ結合する方法以外
    とあるので、上記のSQL以外を求めているのでしょうか。

    (a_table.idをユニークだと仮定)
    SELECT
    t.id
    ,t.category1, MAX(t.category_name1)
    ,t.category2, MAX(t.category_name2)
    FROM(
    SELECT
    t.id
    ,t.category1, CASE WHEN t.category1 = c.category_id THEN c.category_name END AS category_name1
    ,t.category2, CASE WHEN t.category2 = c.category_id THEN c.category_name END AS category_name2
    FROM a_table AS t
    INNER JOIN category AS c ON t.category1 = c.category_id OR t.category2 = c.category_id
    ) AS t
    GROUP BY t.id, t.category1, t.category2
    (場合によってはJOINはLEFT OUTERか)

    ----
    なんのメリットもないSQLだと思います。
  • id:kt26
    コメントありがとうございます。

    前者の方法は自分で思いつきましたので、「その他・もっと簡略化出来ないのか?」と思い、質問させていただきました。

    後者のソースはおっしゃるとおり、全くメリットのない・複雑なものになっています。

    前者の方法しか無い場合、それで納得しますが、もう少し回答を募集したいと思います。

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

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

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

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