DBで指定した値しか存在しないデータを抽出する方法

このQ&Aのポイント
  • DBで指定した値しか存在しないデータを抽出する方法についてアドバイスをいただきたいです。
  • second_noが指定した値のデータを抽出するために、SQL文をどのように記述すればよいか分かりません。
  • 複数のパターンでsecond_noの値を指定し、それに基づいてデータを抽出したいです。
回答を見る
  • ベストアンサー

DBで指定した値しか存在しないデータを抽出する方法

指定した second_no しか存在しない no を抽出したいのですが、 どのように SQL 文を記述すればよいか分からなかったので、 記述方法についてアドバイスいただける方がいらっしゃいましたら、 ご教示の程、よろしくお願いします。 [test_table]テーブル ――――――――― id|no|second_no ――――――――― 1 |11|01 2 |11|03 3 |11|05 4 |12|05 5 |13|00 6 |13|05 7 |14|00 8 |14|05 ――――――――― 【やりたい事1】 下記のように second_no が 00 と 05 のものを抽出すると、no = 11, 12, 13, 13, 14, 14 が抽出されます。 SELECT * FROM test_table WHERE second_no = '00' OR second_no = '05' これを no = 13, 14が抽出され、no = 11, 12 は抽出されないようにしたいです (no = 11 は、second_no に 01 という 00, 05 以外の値が存在する為です。 no = 12 は second_no に 00 が存在しない為です)。 その為、下記の方法で出来ないかと考えました。 1. 全件取得 2. 部分取得 3. 全件取得で獲得した no と部分取得で獲得した no の個数が一致したものが今回取得したいもの。 上記の考え方をソースにしたものは下記となりますが、 この考え方では、no = 12 が抽出されてしまうため、 考え方を変える必要があるのですが、どうすればよいか分かりませんでした。 なお、抽出したい second_no は 00 で抽出したいときもあれば、 00 と 05 で抽出したいときなど複数のパターンがあります。 それと、下記のソースの「データベースユーザ名」「データベースパスワード名」 「データベース名」はそれぞれの環境に合わせる必要があります。 【ソース】 <?php $link = mysql_connect('localhost', 'データベースユーザ名', 'データベースパスワード名'); mysql_select_db('データベース名', $link); // 1.全件取得 $query = mysql_query("SELECT * FROM test_table", $link); while ($row = mysql_fetch_array($query)) { // echo $row["no"]; // echo "<br>"; } //echo "<br>"; // 2.部分一致。 $query = mysql_query("SELECT * FROM test_table WHERE second_no = '00' or second_no = '05'", $link); while ($row = mysql_fetch_array($query)) { // echo $row["no"]; // echo "<br>"; } // 3.ここで1と2の結果を参考に、noが13と14を抽出したい。 mysql_close($link); ?> 【やりたい事2】 上記のソースは複数の SQL 文で実現しようとしていますが、 1つの SQL 文でこのような動作を実現する事は出来ないでしょうか? 以上、よろしくお願いします。

  • PHP
  • 回答数2
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

>組合せはユニークではなく、同じ値が存在しました。 じゃ、ちょっと工夫してこんな感じで? SELECT * FROM test_table WHERE no IN( SELECT no FROM (SELECT DISTINCT no,second_no FROM test_table) AS SUB GROUP BY no HAVING count(second_no)=2 AND sum(IF(second_no IN ('00','05'),1,0))=2 )

iroha_168
質問者

お礼

ご回答ありがとうございます。 ご教示いただいたSQL文で意図した動作になったと思います。 このたびはどうもありがとうございました。

その他の回答 (1)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

追加条件が必要、noとsecond_noの組合せはユニークであること (つまりno=11にsecond_noが00であるものが2つないということ) それであれば思い付きこんな感じで・・・ (もっと効率的なのもありそうですが) SELECT * FROM test_table WHERE no IN( SELECT no FROM test_table GROUP BY no HAVING count(second_no)=2 AND sum(IF(second_no IN ('00','05'),1,0))=2 )

iroha_168
質問者

お礼

ご回答ありがとうございます。 確認した所、no と second_no の組合せはユニークではなく、同じ値が存在しました。 なお、同じ値が存在しない場合、ご教示いただいた SQL 文で動作する事は確認しました。 SELECT no FROM test_table GROUP BY no HAVING count(id) = 2 AND sum(IF(second_no IN ('00','05'),1,0)) = 2 それでこれは私のミスで大変申し訳ないのですが、 no と second_no の組合せはユニークで無い場合も、 【やりたい事1】の抽出ができる方法はないでしょうか? それと【やりたい事2】の1つの SQL 文で実現する方法をご教示いただきありがとうございました。 出来ましたら、no と second_no の組合せはユニークで無い場合も1つの SQL 文で動作する方法をご教示いただけますと大変助かります。 以上、よろしくお願いします。

関連するQ&A

  • DBから抽出したデータにを別テーブルに挿入

    どなたか、知見のある方がいらっしゃいましたらご教授願います。 ●やりたい事  Mysqlデータから抽出した表をに対し、数字を画面で入力後に追加  ボタン押下でDBへInsertする ●現状のソース  //サーバーに接続  //クエリーの実行 $res_result = mysql_query($query,$link); echo "<form action='update1.php' method='POST'>"; while($rew = mysql_fetch_array($res_result)){  echo "<table border='1'>";  echo "<tr>";  echo "<td>";  echo $rew['area'];//→※1  echo "</td>";  echo "<td>";  echo "<input type='text' name='name'>";//→※2  echo "</td>";  echo "<tr>";  echo "</table>";  } echo ("<input type='submit' value='追加'>"); 上記の※1と※2の値を「torihikisaki」テーブルに格納したいのです。 'update1.php'に値を渡してInsert文を実行しようとおもったのですが 値の渡し方が良く分かりませんでした。イメージでは※1と※2を 配列で渡し、foreachで一行づつInsertを実行するのかと思っていました。 説明が下手で申し訳ないのですが、ご教授願いますようお願い致します。

    • ベストアンサー
    • PHP
  • PHP phpMyAdmin

    hetemlのmysqlを利用しているのですが phpからmysqlへの格納が上手くいきません。 ■phpソース <?php $link = mysql_connect('サーバー名','ユーザー名','パスワード'); mysql_select_db('データベース名'); mysql_query("INSERT INTO myname VALUES ('test')"); echo mysql_errno($link); echo mysql_error($link); ?> ■phpMyAdmin テーブル myname を作成済 phpはエラーを出していないのですが テーブル myname のフィールドに test が格納されません。(変化ありません)

    • 締切済み
    • PHP
  • mysql内データを降順件数指定表示

    タイトル通り、mysql内のデータを降順で件数指定して表示しようとしていますが、 どうしてもうまくいきません。 var_dumpでチェックしても問題ないように思われるのですが、うまくいかないということで見落としているミスの箇所があると思われるのですが、つまづいてしまいます。 以下にコードを載せますので、どなたかアドバイスをいただけないでしょうか。 <?php $debug = false; //DB 接続 $url = "localhost"; $user = "ユーザー名"; $pass = "パスワード"; $db = "DB名"; $link = mysql_connect($url,$user,$pass) or die("No Connected"); $sdb = mysql_select_db($db,$link) or die("No Connected"); if($debug) echo_r($_GET); mysql_set_charset('utf8'); //エラーチェック //リクエストメソッドチェック if($_SERVER["REQUEST_METHOD"] != "GET") { echo "Error: invalid method"; exit(); } //クエリ生成 $query = "SELECT * FROM shops ORDER BY id DESC limit 4"; $result = mysql_query($query) or die($query . '<br />' . mysql_error() . '<hr />'); $num_rows = mysql_num_rows($result); ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>新着情報</title> </head> <body> <p>場所:<?php echo $row['area']; ?></p> <p>店名:<?php echo $row['name']; ?></p> </body> </html>

    • ベストアンサー
    • PHP
  • 配列で指定した値のみをMySQLからループで呼び出す方法

    MySQLから呼び出す際の下記のような書式を簡略化したいと思っています。 $test = $row['test']; アドバイスのほどよろしくお願いいたします。 /* 以下ソース */ $field =array('a','b','c','d','e','f'); function ROW_DATA(){ grobal $field; foreach($field as $key => $val){ return $key = $row['$key']; } } $sql = "SELECT * FROM data"; $rs = mysql_query($sql); while($row = mysql_fetch_array($rs)) { ROW_DATA(); }

    • ベストアンサー
    • PHP
  • データベース表示結果のデザイン

    データベースの全件検索結果の表示のデザインをしたいと考えているのですがうまくいきません。 PHPのソースは以下の通りです。 <?php mysql_connect('localhost','root','******'); mysql_select_db('AAAAAAAA'); $sql= "select * from ??????"; $result = mysql_query($sql); $rows = mysql_num_rows($result); if($rows == 0){ echo "<p>該当データがありません。</p>"; } else { while($row = mysql_fetch_array($result)){ echo "<p>"; echo $row["renban"]; echo " "; echo $row["tourokubi"]; echo " <br />"; echo $row["title"]; echo " "; echo $row["A"]; echo "-"; echo $row["B"]; echo " "; echo $row["C"]; echo " "; echo $row["D"]; echo " "; echo $row["E"]; echo " "; echo $row["F"]; echo " "; echo $row["G"]; echo "</p><hr />"; } } ?> この検索結果の1つ1つのデータをテーブルで囲んでechoで呼び出したA~Gまでの項目を<tr>や<td>で区切って表のような形にしたいのですがどのようにすればいいでしょうか。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • PEAR::DBで取得したデータで処理を分岐したい

    DB関連が苦手な上、動作がうまくいかず、アドバイスをいただければと存じます。現在PHP4、MYSQL4.1.20を使用しております。 行いたい処理は、 PEAR::DBで実行したクエリ SELECT MAX(id) FROM table WHERE `name` = '$test'; 等で、whereで一致する行を絞込み、そのうちの最大値のIDを取得 (クエリの動作は、MYSQL単体で行った場合問題なしで、idの値を取得) その後MAX()で取得した1つIDを、$resultに代入したいのですが、どの様に行えばよいのかわかりません。 今までfetchRow()で事足りていたことで、他の関数がわかりません>< $result=$DB->getOne("SELECT MAX(id) FROM table WHERE `name` = '$test';"); といった感じで取得するのが良いのかも知れませんが、うまく取得できずに詰まっておりますorz 解決法、アイデア等ございましたら、お伺いできればと存じます。 上記ソースは、質問させていただく上で、新規に書いたソースですので、カラム名、変数は仮のものです。不明な情報等ございましたら、捕捉させていただきたいと存じます。

    • 締切済み
    • PHP
  • DBの値を基にliにulをネストしたリスト作成

    http://soft.fpso.jp/develop/php/entry_2790.htmlのようなphpでliにulをネストしたリストを作成したいと思います。 上記ページでは入れ子構造の配列を用意し実現していましたが、 下記のようなデータベースで同様の事を実現する方法がわからなかったので、 アドバイスいただける方がいらっしゃいましたら、ご教示の程よろしくお願いします。 なお、データベースのサンプルはあくまでサンプルのため、別途必要なフィールドなどがありましたら、その旨ご指摘いただければと思います。 【データベースのサンプル】 CREATE TABLE IF NOT EXISTS `sample_db` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(64) NOT NULL, `path` varchar(255) NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `path` (`path`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=11 ; INSERT INTO `sample_db` (`id`, `name`, `path`) VALUES (1, '2010年', '.1.'), (2, '6月', '.1.2.'), (3, '28日', '.1.2.3.'), (4, '12時', '.1.2.3.4.'), (5, '13時', '.1.2.3.5.'), (6, '29日', '.1.2.6.'), (7, '30日', '.1.2.7.'), (8, '7月', '.1.8.'), (9, '8月', '.1.9.'); 【ソースコードのサンプル】 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>タイトル</title> </head> <body> <?php $link = mysql_connect('localhost', 'データベースユーザ名', 'データベースパスワード名'); mysql_select_db('データベース名', $link); /* ▼▼▼ここから下の記述が分かりません。▼▼▼ */ $query = mysql_query("SELECT * FROM sample_db", $link); ?> <ul id="id_ul"> <?php while ($row = mysql_fetch_array($query)) { ?> <li class="class_li"><?php echo $row["name"]; ?></li> <?php } ?> </ul> /* ▲▲▲ここから上の記述が分かりません。▲▲▲ */ <?php mysql_close($link); ?> </body> </html> 以上、よろしくお願いします。

    • ベストアンサー
    • PHP
  • MySQLで0で検索できない

    以下のようなPHPのソースとMySQLのテーブルで、numberが0の行をhtmlで取得しようとしているのですが、検索窓に0を入れて検索しても取得できません。ちなみに、numberが1や2の行は取得することができます。 なぜnumberが0の行を取得できないかと、どうすればnumberが0の行を取得することができるか教えてください。 <PHPのソース> <?php $url = "localhost"; $user = "root"; $pass = ""; $db = "test"; $html = ""; // MySQLへ接続する $link = mysql_connect($url,$user,$pass) or die("MySQLへの接続に失敗しました。"); // データベースを選択する $sdb = mysql_select_db($db,$link) or die("データベースの選択に失敗しました。"); // クエリを送信する $sql = "SELECT * FROM test"; $result = mysql_query($sql, $link) or die("クエリの送信に失敗しました。<br />SQL:".$sql); //結果セットの行数を取得する $rows = mysql_num_rows($result); ?> <form action="" method="post"> <input type="text" name="numberSearch" value=""> <input type="submit" value="検索"> </form> <?php //表示するデータを作成 if($rows && !empty($_POST['numberSearch'])){ while($row = mysql_fetch_array($result)) { if ($row["number"] == $_POST['numberSearch']) { $html .= "<tr>"; $html .= "<td>".$row["alphabet"]."</td><td>".$row["number"]."</td>"; $html .= "</tr>\n"; } } }else{ $msg = "データがありません。"; } // MySQLへの接続を閉じる mysql_close($link) or die("MySQL切断に失敗しました。"); ?> <html> <head> <meta charset="utf-8"> <title>numberSearch</title> </head> <body> <table width = "200" border = "0"> <tr bgcolor="##ccffcc"><td>alphabet</td><td>number</td></tr> <?= $html ?> </table> </body> </html> <データベースのテーブル> alphabet number A 0 B 1 C 2 D 1 E 1 F 0 G 1

    • ベストアンサー
    • MySQL
  • PHP & MySQL 抽出したデータの1番目が出力されない

    学校の課題で、PHP & MySQLを使ってウェブを作っています。 BBTapahtumaテーブルからJas_nroをキーにデータを抽出して、Tap_nroとTap_nimiを降順に出力します。 実行してもエラーはでません。現在BBTapahtumaには10件、該当Jas_nroのレコード数は5件(Tap_nro:10-8-7-6-1)ですが、表示されるのは4件(Tap_nro: 8-7-6-1)で、一番初めにくるべきデータが出てきません。where Jas_nro=$no を外し全レコード抽出(Tap_nro: 9-8-7-6-5-4-3-2-1)したり、order by Tap_nro desc を外して昇順(Tap_nro: 6-7-8-10)にしても、やはり1件目に当たるデータが出力されません。 $_SESSION['no']=$noは「1」が入っており、MySQL consoleで「select * from BBTapahtuma where Jas_nro=1 order by Tap_nro desc;」を実行すると、5件出てくるのでその次の出力の方に誤りがあるのだと思います。 テーブルは下記の3項目。テーブルを閉じた後に Lisa (別ページへのリンクボタン)があります。 Tap_nro, Tap_nimi, Lisatietoja(各データの詳細へのリンクボタン) ソースは次の通りです。どこに間違いがあるのか見つけられません。よろしくお願いいたします。 <?php $host="localhost"; $user="xxxx"; $password="xxxx"; $dbname="bb"; $yhteys = mysqli_connect($host, $user, $password, $dbname); $no = $_SESSION['no']; $sql = "select * from BBTapahtuma where Jas_nro=$no order by Tap_nro desc"; if(!$tulos=mysqli_query($yhteys, $sql)) { echo "error"; exit; } if(!$row=mysqli_fetch_array($tulos, MYSQLI_BOTH)) { echo "tiedot eivat ole tietokannassa."; } echo "<table border=0>"; echo "<tr><td>Numero &nbsp&nbsp</td><td>Tapahtuman nimi &nbsp&nbsp</td><td></td></tr>"; while($row=mysqli_fetch_array($tulos, MYSQLI_BOTH)){ echo "<tr>"; echo "<td>". $row['Tap_nro'] ."</td>"; echo "<td>". $row['Tap_nimi'] ."</td>"; echo "<form action='omatkeikkatiedot11.php' method='POST'>"; echo "<span class='button'><input type=hidden name=Tap_nro value=". $row['Tap_nro'] .">"; echo "<td><input type=submit name=lisa id=lisa value='Listietoja'></td></form></span></tr>"; } echo "</table>"; echo "<br><br>"; echo "<form action=omatkeikkatiedot2.php method=POST>"; echo "<div class='button'><input type=hidden name=Jas_nro value=". $row['Jas_nro'].">"; echo "<input type=submit name='Lisaa' id='laheta' value ='Lisaa'>"; echo "</div></form>"; ?>

    • ベストアンサー
    • PHP
  • php 投票システム

    データベースと連動した投票システムを考えております。 phpとMySQLを使用したもので、対応するボタンを押すと1票投じられるというものです。 この仕組み自体は実現できたのですが、 ブラウザの更新ボタンを押すと、『情報を再送信する必要があります』と表示され、『はい』を押すと、自動的に1票投じられてしまいます。 スクリプトは以下のようになるのですが、上記のような不具合を修正するためにはどうすればよいのでしょうか。 アドバイス、具体的なソース、また、他の部分における修正すべき箇所など、ご指摘いただきたいと思います。 よろしくお願いいたします。 <?php echo "<table border=0>"; echo "<tr><td colspan=4 align=left><img src=logo-touhyou.gif></td></tr>"; echo "<tr><td><form method=post action="; echo $_SERVER["PHP_SELF"]; echo "><input type=hidden value=1 name=posi><input type=image src=logo-posi-s.gif border=0></form></td>"; echo "<td><form method=post action="; echo $_SERVER["PHP_SELF"]; echo "><input type=hidden value=1 name=deep><input type=image src=logo-deep-s.gif border=0></form></td></tr></table>"; $posi=$_POST["posi"]; $deep=$_POST["deep"]; if ($posi==1){ $server="mysql..jp"; $dbname="LA"; $user="LA"; $pass=""; $conn = mysql_connect($server,$user,$pass); $conndb = mysql_select_db($dbname); $sql="SELECT posi FROM test WHERE id =1 LIMIT 1"; $res=mysql_query($sql); while($row = mysql_fetch_assoc($res)) { $row_con=mb_convert_encoding($row["posi"], "shift_jis", "auto"); echo $row_con; echo "<br>"; $number1=1; $after=$row_con+$number1; echo $after; echo "<br>"; mysql_query("LOCK TABLES test WRITE"); $sql_1="UPDATE test SET posi='$after3' WHERE id =1 LIMIT 1"; $ins=mysql_query($sql); mysql_query("UNLOCK TABLES"); if ($ins_1){ echo "ポジティブ投票完了"; } $sql_2="SELECT posi FROM test WHERE id =1 LIMIT 1"; $res_2=mysql_query($sql_2); while($row_2 = mysql_fetch_assoc($res_2)) { $row_con_2=mb_convert_encoding($row_2["posi"], "shift_jis", "auto"); echo $row_con_2; } } mysql_close($conn); } if ($deep==1){ $server="mysql..jp"; $dbname="LA"; $user="LA"; $pass=""; $conn = mysql_connect($server,$user,$pass); $conndb = mysql_select_db($dbname); $sql2="SELECT deep FROM test WHERE id =2 LIMIT 1"; $res2=mysql_query($sql2); while($row2 = mysql_fetch_assoc($res2)) { $row_con2=mb_convert_encoding($row2["deep"], "shift_jis", "auto"); echo $row_con2; echo "<br>"; $number1=1; $after2=$row_con2+$number1; echo $after2; echo "<br>"; mysql_query("LOCK TABLES test WRITE"); $sql2_2="UPDATE test SET deep='$after2' WHERE id =2 LIMIT 1"; $ins2=mysql_query($sql2_2); mysql_query("UNLOCK TABLES"); if ($ins2){ echo "ディープ投票完了"; } $sql2_2="SELECT deep FROM test WHERE id =4 LIMIT 1"; $res2_2=mysql_query($sql2_2); while($row2_2 = mysql_fetch_assoc($res2_2)) { $row_con2_2=mb_convert_encoding($row2_2["deep"], "shift_jis", "auto"); echo $row_con2_2; } } mysql_close($conn); } ?>

    • ベストアンサー
    • PHP

専門家に質問してみよう