MySQLで以下のような事って出来ますでしょうか?


・Aテーブル(条件用テーブル)
・Bテーブル(料金表)

BテーブルのmoneyフィールドとAテーブルのmoneyフィールドが一致すれば、位置した行を返す。


moneyが100のものを表示したい時、SQL文で言えば
SELECT money FROM b_table WHERE money=100

で表示されますが、money=「100」の値の部分を別テーブルから参照できればと思います。

※100はあくまで例で、条件テーブルのmoneyフィールドには様々な値が入っているとします。


現在は以下のようにしています。

$sql = "SELECT money FROM a_table";
$res = mysql_query($sql);

while($a = mysql_fetch_array($res)){

$sql_b = "SELECT money FROM a_table WHERE money='$a[money]'";
$res_b = mysql_query($sql_b);
while($b = mysql_fetch_array($res_b)){
echo $b."<br>";
}

}

joinを使う方法も考えましたが、フィールド数が増えた場合や範囲検索が必要な場合、使えないと思い、現在は上記のようにしています。

しかし、汎用性が低いと思いますので、より良い方法が無いかと思い、質問させていただきました。ご存じの方は、アドバイスいただければと思います。

MySQLは4.0.26です。

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

回答1件)

id:chuken_kenkou No.1

回答回数722ベストアンサー獲得回数54

ポイント80pt

MySQLは4.0.26です

aとb、どちらの表の検索結果で、どちらの表を検索したいのか、質問文では誤記もあるようですが。。。

MySQL 4.0系とのことなので、サブクエリが使えないと記憶しています。


そのため、

select * from b_table
 where money in(select money from a_table)

select * from b_table as b
 where exists(select * from a_table
                     where b.money=money)

といった選択肢がなくなります。

MySQL 4.0系で、SQL1文で実現したいなら、

select money
 from b_table as b
  left join a_table as a
   on b.money=a.money
 where a.money is not null

といったSQLを使うしかないと思います。


joinを使う方法も考えましたが、フィールド数が増えた場合や範囲検索が必要な場合、使えないと思い

どういう意味でしょうか?

具体的に説明してもらえば、具体的なアドバイスができるかも知れません。

id:kt26

回答ありがとうございます。やはりそろそろMySQl4.1系以上に変えるべきですかね。。

バージョンの件についてはもう少し再考します。


また、joinの件ですが、思い違いをしていました。

以下のフィールドがAテーブルにあるとして

money_s(最低価格)、money_b(最大価格)、tax(税)


SELECT * FROM b_table AS b LEFT JOIN a_table AS a on (b.money>=a.money_s AND b.money<=a.money_b AND b.tax=a.tax) WHERE a.money_s is not null ORDER BY a.a_table_id

みたいなやり方でも、目的通り条件にあった値がヒットしました。

と言うわけで、JOINを使っていきます。アドバイスありがとうございました。

2007/11/14 22:29:09

コメントはまだありません

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

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

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

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