PHP+MYSQLで任意の数を入力し、その入力結果から演算をし、該当するデータを表示させたいです。



例えば以下のようなデータがあるとします。
x y z
--------------
A,14,9
B,23,30
C,45,1
D,56,7

ここで、抽出条件を
・(入力した値a + z)が30以上
・入力した値b±15の範囲内
とします。

入力値aが1、入力値bが15だとすると、2つの条権に該当するのはBだけですので、B,23,30と表示されるような感じです。


プログラムソースをそのまま書いていただいても構いませんし、参考となるページでも構いません。特に・(入力した値a + z)が30以上をどう記述して良いか分かりません。よろしくお願いします。

回答の条件
  • 1人20回まで
  • 登録:2010/03/28 00:11:35
  • 終了:2010/03/29 04:24:13

ベストアンサー

id:GreenStar No.5

GreenStar回答回数192ベストアンサー獲得回数462010/03/28 01:27:10

ポイント30pt

移項できないほど複雑ならばMySQL側での絞込みとphp側での絞込みの2段階にするしかないですね。

$a = 1;
$b = 15;
$s = 'SELECT * FROM テーブル名 WHERE y BETWEEN ' . ($b - 15) . ' AND ' . ($b + 15);
$r = mysql_query($s);
while ($row = mysql_fetch_assoc($r)) {
    if ($a + $row['z'] >= 30) {
        echo $row['x'] . $row['y'] . $row['z'];
    }
}
id:sitterutsumori

なるほど

2010/03/28 14:58:24

その他の回答(10件)

id:GreenStar No.1

GreenStar回答回数192ベストアンサー獲得回数462010/03/28 00:33:30

ポイント20pt

下記のような具合でSQLを生成します。$a や $b の値を変えてみて、どのようなSQLになるかを見てください。

<?php
$a = 1;
$b = 15;
$s = 'SELECT * FROM テーブル名 WHERE y BETWEEN ' . ($b - 15) . ' AND ' . ($b + 15) . ' AND z >= ' . (30 - $a);
echo $s;
?>

あとは mysql_query($s) でMySQLにSQLを投げて mysql_fetch_assoc などで受けます。

http://jp2.php.net/manual/ja/function.mysql-query.php

id:ukirx No.2

りく回答回数3ベストアンサー獲得回数02010/03/28 00:33:54

質問の意味が分からん

id:kami_kazushige No.3

かみ かずしげ回答回数13ベストアンサー獲得回数22010/03/28 00:47:09

ポイント20pt

 1つめの「(入力した値a + z)が30以上」というのは、単純に移項して、

30-a <= z

とすればいいのではないでしょうか。

 2つめの「入力した値b±15の範囲内」というのは(Yがその範囲内となる条件なら)、

(b-15 <= y) and (y <= b+15)

となります。つまり、入力した値のaとbを変数$aと$b、テーブル名を$table、クエリーの文字列を$queryに入れるとすると、

$query = sprintf("SELECT X, Y, Z FROM %s WHERE (%d <= Z) AND (%d <= Y) AND (Y <= %d)", $table, 30-$a, $b-15, $b+15);

として、$queryを実行すれば条件に一致したレコードが得られる筈です。

id:sitterutsumori

説明が後付で申し訳ないのですが、「(入力した値a + z)が30以上」というのは簡単な例で、実際は複雑な計算を行います。ですので、ポイントはzをどうやってひっぱって計算をするかです。zの値をひっぱってphpでの変数にとかはできないですかね?

2010/03/28 00:52:08
id:kami_kazushige No.4

かみ かずしげ回答回数13ベストアンサー獲得回数22010/03/28 01:19:35

ポイント20pt

> 「(入力した値a + z)が30以上」というのは簡単な例で、実際は複雑な計算を行います。

とのことですが、どんなに複雑でもクエリーに書くことができれば書くまでのことですよね? それともクエリーを書く段階では検索条件が決定できないということなのでしょうか?

id:sitterutsumori

入力値より、zを使用して演算を行ってHという値を出します。そのHを範囲の基準とするのですが、Hの算出過程が400行ぐらいありますが、開業とかそのままクエリーに書いてしまってよいのでしょうか?

2010/03/28 01:31:35
id:GreenStar No.5

GreenStar回答回数192ベストアンサー獲得回数462010/03/28 01:27:10ここでベストアンサー

ポイント30pt

移項できないほど複雑ならばMySQL側での絞込みとphp側での絞込みの2段階にするしかないですね。

$a = 1;
$b = 15;
$s = 'SELECT * FROM テーブル名 WHERE y BETWEEN ' . ($b - 15) . ' AND ' . ($b + 15);
$r = mysql_query($s);
while ($row = mysql_fetch_assoc($r)) {
    if ($a + $row['z'] >= 30) {
        echo $row['x'] . $row['y'] . $row['z'];
    }
}
id:sitterutsumori

なるほど

2010/03/28 14:58:24
id:kami_kazushige No.6

かみ かずしげ回答回数13ベストアンサー獲得回数22010/03/28 01:57:40

ポイント20pt

> そのHを範囲の基準とするのですが、Hの算出過程が400行ぐらいありますが、

 そんなに複雑なんですか! SQL文には改行があっても無視されるから大丈夫な筈ですけど…。心配なので検索してみたら、他のサイトに以下のような質問と回答がありました。

PHPでのMYSQL文の文字数制限

http://www.phppro.jp/qa/2143

 私のような力づくのやり方では、エラーになるかもしれないですね。GreenStarさんが既にお答えになっている方法が安全だと思います。

id:sitterutsumori

ありがとうございます

2010/03/28 14:58:45
id:GreenStar No.7

GreenStar回答回数192ベストアンサー獲得回数462010/03/28 02:01:41

ポイント20pt

Hの算出過程が400行ぐらい

その式を見てみないとなんとも言えませんが、あまり複雑な式はダメな場合もありえますし、MySQL側で処理させるのであればストアドファンクションにするのがシンプルだとは思います。

id:sitterutsumori

ストアドファンクションはなんだか難しそうですね。

ちなみに算出過程を簡単に表すと

S=z * 20

H=asin(S)

になり、Sが範囲ならそのままクエリに入れればよさげだったんですが、Hの場合がわからなかったです

2010/03/28 15:02:16
id:arisu0416 No.8

みさ回答回数3ベストアンサー獲得回数02010/03/28 11:10:43

よくわからない

id:sitterutsumori

ぼくもよくわからない

2010/03/28 15:02:23
id:hakai-sin No.9

hakai-sin回答回数4ベストアンサー獲得回数02010/03/28 15:16:27

ポイント20pt

(はてなにより削除しました)

id:hakai-sin No.10

hakai-sin回答回数4ベストアンサー獲得回数02010/03/28 15:18:37

ポイントください!

おねがい!

id:p332 No.11

p332回答回数36ベストアンサー獲得回数32010/03/28 16:23:11

ポイント30pt

SQLだけで、必要な行を抽出するのは困難なので、まず

・b±15の範囲内

のレコードを取得してから、

・a + z

の値によって表示するしないを切り替えれば良いです。

下記がそのコードです。

	
	function asin_H($S){
		//400行の関数
		return 30;
	}
	
	//準備
	$con = mysql_connect("localhost", "user1" , "pass1");
	$tmp = mysql_select_db("db1");
	$a = 1;
	$b = 15;
	
	//bで絞り込み
	$sql = "select x, y, z from table1 ";
	$sql .= "where y between ".($b-15)." and ".($b+15);
	$rs = mysql_query($sql, $con);
	
	while($r = mysql_fetch_assoc($rs)){
		$S = $r["z"] * 20;
		$H = asin_H($S);
		//aの条件に合う行だけ表示
		if($a + $r["z"] > $H){
			echo "";
			foreach($r as $v){
				echo $v."";
			}
			echo "";
		}
	}
	echo "</table>";

  • id:Km1967
    横から何だが、回答9は回答1のコピペだぞ。 回答コピペのような悪質行為を許してしまうと、ワシらも受け取りポイントが減って迷惑じゃ。
    不適切な回答として通報はしておいたが、ポイントを与えてしまっては行為を認めてしまったことにもなる。誤ってポイントを与えてしまった旨、はてなに通報されることを勧める。 ポイントの返還は無理かもしれぬが当該ユーザーに対しての処置は行うであろう。


    通報は下記から
    http://www.hatena.ne.jp/faq/q?c=13
  • id:hatenasupport
    http://q.hatena.ne.jp/1269702692#a1004035
    につきましては、自身の回答のコピーであり著作権侵害に該当するとの申立がありましたため、はてなにより削除しました。
  • id:GreenStar
    id:hatenasupport
    私が通報したことがバレバレですね。 
    削除した相手に対して告知すれば良いだけの事をどうして公にして事を荒立てるのか理解に苦しみます。

    公にされてしまったので、はてなサポート窓口からの返信も公にさせていただきます。
    返信日時は 2010/03/29 18:43 です。
    >>
    こんにちは。はてなスタッフの中川です。
    このたびはお手数をおかけいたしております。

    本件につきましては、投稿の削除および当該アカウントの利用停止をいたしました。
    ご確認いただければ幸いです。
    どうぞよろしくお願いいたします。
    <<
    うごメモに3/30の投稿がある事から、今現在、利用停止になっているような形跡は見られません。
    http://ugomemo.hatena.ne.jp/188EA9A0AA308EAD@DSi/movie/308EAD_099EF338F9CF0_000?in=use
    http://www.hatena.ne.jp/hakai-sin/
    http://q.hatena.ne.jp/hakai-sin/

    公にされたのはサポートの方ですから、公の場での回答をお願いします。
  • id:hatenasupport
    現在、最近の活動の時間表示に不具合が生じており、昨日分の投稿が本日の分として表示されております。
    作品にアクセスいたしますと29日分の投稿であることがご確認いただけます。
    http://i.hatena.ne.jp/idea/25633
    http://i.hatena.ne.jp/idea/25717
    ご迷惑をおかけいたしますがご容赦ください。

    また、著作権侵害に該当するとして削除を行う場合には、権利者からの申告によることを原則といたしており、通常は他者の回答と同一の内容が記述されている場合も削除対象とはしておりません。
    そのような理由から削除理由の説明が必要と判断いたしましたため告知いたしました。ご了承いただきますようお願い致します。
  • id:GreenStar
    id:hatenasupport
    3/30ではなく 2010/03/29 21:33:54 と表示されておりました。この部分に関しては謝りますが、
    21:33:54 という事は、私への返信(18:43)の後でも投稿できたという事に変わりはありません。
    アイデアへのリンクにつきましても4ヶ月も前のものを当然のように持ち出されては利用者として困ります。
    どのような理由で4ヶ月経っても修復/改善できぬかはさておきますが、いずれにしても、そちらの理由であって、私には関係ありません。
    急いで取り繕ったような返答は期待しておりません。理路整然とした調査報告をお願いします。

    今後も「権利者からの通報により削除は行うが、その旨を開示する」という意思表示ととらえましたが、それでよろしいか?
    そのような対応を取られてしまうとなれば「権利者であっても通報を躊躇う」という事は考えなかったのでしょうか?
    これまで行われた幾多の削除において、説明の無いもののほうが圧倒的に多いようですが、それらと比較しても、今回は必要だっとおっしゃられるのでしょうか?
    こちらも論理的な解法を願いたいです。

    16:54:25 に送った問い合わせへの返答でもあると理解しておりますが、まったくもって返答としては不十分です。
    また、これによって sitterutsumori さんたちへのメール送信も行われてしまうという点もご配慮いただきたいです。
    グループ掲示板に記載して、そちらへ誘導等も出来たのではありませんか? 何かにつけ問題だらけです。
    法務部や上層部ともよくよく話し合ってから回答お願いします。

    16:54:25 に送った問い合わせ内容は下記です。
    >>
    何故に、このような仕打ちをするのでしょうか?
    今までどおり削除すれば良いだけのものをどうして騒ぎを大きくするのでしょうか?
    この書き込みによって通報者が誰(GreenStar)なのかが表に出てしまいました。
    「著作権保護の観点から削除しました」としておけば、同様の他の書き込みに対しても牽制となりよかったのですが、これでは単に「通報した者は告示されるから、報告しないほうがいいな」という方向になるとは少しも思わなかったのでしょうか?
    通報者を保護するという部分が微塵にも感じられませんが、はてな社では、どのようにお考えなのでしょうか? どのように教育訓練しておられるのでしょうか?
    上記について謝罪(何をもって謝罪とするかは御社で考えてください。それによって今後の対応を考えます。ポイントや金品などはもちろん要りません。)を要求すると共に、今後、いつまでに、どのような対応を取るかをご連絡ください。
    投稿した一個人の脊椎反射では済まされません。従業員の一人がしでかしたことでも会社に責任があります。中川さんの返答も要りません。運営責任者並びに経営陣からの正式な返答(サイト上でお願いします)を期待します。
    <<
  • id:hatenasupport
    こちらの返答についてはお問い合わせフォームよりお送りいただいたお問い合わせに対するご返信ではなく、
    http://q.hatena.ne.jp/1269702692#c175569
    こちらのコメントにて、特に
    >>
    公の場での回答をお願いします。
    <<
    とのご要望をいただきましたため、

    ・利用停止後に投稿が行われていたとのご指摘に対するご回答
    ・削除理由の公開を行った理由

    この2点のみに関して、特例としてコメント欄にてご返答させていただきましたものです。
    ご了承ください。

    お問い合わせに対するご返信はメールにて行っておりますので、別途ご返信をさせていただきます。
    恐れ入りますが、今しばらくお待ちいただきますよう、よろしくお願いいたします。
  • id:GreenStar
    >利用停止後に投稿が行われていたとのご指摘に対するご回答
    >削除理由の公開を行った理由

    いずれも http://q.hatena.ne.jp/1269702692#c175623 で書いたとおり立証もなければ説明も不十分。
    即時応答でなくとも、誰もが納得できるような方向にまとめてください。
  • id:sitterutsumori
    sitterutsumori 2010/03/30 19:10:39
    間違えてポイント振ったばっかりにすみませんでした。
  • id:GreenStar
    こちらこそ。騒がせてごめんなさい。

    サポート担当が 2010-03-29 19:09:09 のようなコメントを入れるという対応。他では類を見ません。
    他をまねてベストアンサーとか下らんシステム組み込むなら、時計くらい調整しろって言いたいですね。
    運営体制/サポート担当どちらかあるいは両方の対応が悪いんです。 

    sitterutsumori さんが悪いのではないです。いえ、私以上に被害者です。

    運営以前に、一番悪いのはコピペするヤツですけどね。破壊神なんてIDもわざとらしい。
  • id:kami_kazushige
    sitterutsumoriさんへ

    あまりお役に立てなかったのにポイントをいただいて何だか申し訳ないような…。それでというわけでもないんですけど、今ごろになってプログラムの件でちょっと思いついたことがあるのでコメントさせていただきます。

    毎回テーブルの全件を対象にしてyの値からHを算出するのはレコード数が多くなると処理が重くなりそうだなと思います。そこで、もしも、

    (ア) yの値とHの値の対応が常に同じ
    (イ) yの取り得る値が限られている

    という二つの条件が成り立つのなら、予めyとHの対応表を作って別のテーブルに入れておいて、yをキーにしてメインのテーブルとつないでやれば、SQL文で条件に一致したレコードを得られるんじゃないかと思ったのですが、いかがでしょうか。そんなに単純なものではないのかもしれませんが…。
  • id:GreenStar
    はてなより返信が来た。長文だったので私の理解範疇で端折りますと、
    「通報で削除を希望する」とした場合には削除&削除理由コメントがなされる。
    「通報はしても削除は望まない」場合は当該ユーザーに対して適宜対処がなされる。
    以上のように理解したので、他の方も自身の記事や回答がコピペされた場合には「通報して処分してもらう」という事を行うほうが良いだろう。

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

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

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

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません