• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:組み合わせのマッチィングを過去のものと重複させない)

組み合わせのマッチィングを重複させない方法について

このQ&Aのポイント
  • 素材のマッチィングで過去の組み合わせを重複させずにテストするためのプログラムを作りたい。
  • 現在の解決策としては、テストごとにカラムを増やし、PHPのSQL文を書き足す方法を使っている。
  • しかし、カラムの増加やPHPの書き足しは設計上好ましくないため、改善案を模索している。

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

  • ベストアンサー
  • aa_akiya
  • ベストアンサー率100% (21/21)
回答No.2

やはり勘違いしていたようですね申し訳ないです。 NO.1のお礼コメントにあるデータをもとに考えます。 1.主体となる素材に紐づくテストデータをまずは抽出する 2.「1」の中に存在しない素材を抽出する 3.主体となる素材は抽出対象としない 後述するSQLの考え方は上記のようなものです。 以下のようなSQLで求めるものを抽出できると思いますがいかがでしょうか。 ■素材Aを主体としてすべてのテストについて被りのないものを抽出したいとき SELECT material.name FROM material WHERE NOT EXISTS (SELECT * FROM material_test WHERE material.id = material_test.material_id AND test_id IN (SELECT test_id FROM material_test WHERE material_id = 1)) AND material.id <> 1 実行結果:D F H(3行) ■素材Aを主体としてtest1について被りのないものを抽出したいとき SELECT material.name FROM material WHERE NOT EXISTS (SELECT * FROM material_test WHERE material.id = material_test.material_id AND test_id IN (SELECT test_id FROM material_test WHERE material_id = 1 AND test_id IN (1))) AND material.id <> 1 実行結果:B D F G H(5行) ■素材Dを主体としてtest1~test3について被りのないものを抽出したいとき SELECT material.name FROM material WHERE NOT EXISTS (SELECT * FROM material_test WHERE material.id = material_test.material_id AND test_id IN (SELECT test_id FROM material_test WHERE material_id = 3 AND test_id IN (1, 2, 3))) AND material.id <> 3 実行結果:A B E F(4行)

pintxos
質問者

お礼

aa_akiya様 おお! 有難うございます。 これぞ求めていた内容です。 今後勉強しないといけない項目もわかり本当に助かりました。 大変感謝いたします。 どうも有難うございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • aa_akiya
  • ベストアンサー率100% (21/21)
回答No.1

お気づきの通り、データが増えるにしたがってテーブルのカラムが増える設計は、プログラムの改修が煩雑になるので控えた方が良いと思います。 より良い設計のために「データベースの正規化」について学習することをお勧めします。 ■materialテーブル id | name 1 | A 2 | B 3 | D 4 | E 5 | F 6 | G ■testテーブル id | name 1 | test1 2 | test2 3 | test3 4 | test4 ■material_testテーブル material_id | test_id 1 | 1 1 | 2 2 | 2 3 | 3 4 | 1 6 | 2 6 | 3 ■test1、test2に参加していない素材を抽出するSQL SELECT material.name FROM material WHERE NOT EXISTS (SELECT * FROM material_test WHERE material.id = material_test.material_id AND test_id IN(1, 2)) 実行結果:D F(2行) test2、test3に参加していない素材を抽出する場合は「IN(1, 2)」の部分を「IN(2, 3)」とします。 test3以前に参加していない素材を抽出する場合は「IN(1, 2)」の部分を「<= 3」とします。 仕様の解釈が間違っていたらごめんなさい。

pintxos
質問者

お礼

aa_akiya様 ご回答どうも有り難うございます。 「データベースの正規化」勉強します。 仕様についてですが、お答えいただいたのはtestを主体にに考えtest1,test2のどちらでもマッチングされていない素材をtest3で集める仕様かと解釈します(ちゃんと把握していなければ申し訳ありません)。 ここで求めたかったのは一つの素材を主体として考えその素材がマッチングしてないものを導き出したいというものです。質問事態が要領を得ていなくて申し訳ありません。 頂いた回答を基に素材Hを足し、Hはtest3に参加したとしますと ■materialテーブル id | name 1 | A 2 | B 3 | D 4 | E 5 | F 6 | G 7 | H ■testテーブル id | name 1 | test1 2 | test2 3 | test3 4 | test4 ■material_testテーブル material_id | test_id 1 | 1 1 | 2 2 | 2 3 | 3 4 | 1 6 | 2 6 | 3 7 | 3 Aはtest1,test2に参加している。 Dはtest3に参加している。 Hはtest3に参加している。 AとDは同時に参加しているtestがないのでtest5以降のtestでマッチングできる。 AとHは同時に参加しているtestがないのでtest5以降のtestでマッチングできる。 DとHはtest3で同時に参加しているのでDやHを主体として考えるとtest3以降DとHのマッチングはできないが、Aを主体として考えた場合たとえDとHがマッチング済みでバッティングすることになってもAとD,AとHのマッチングがtest5できるとすると考えるものです。 頂いた回答をもとに自分自身でも考えてみましたが、今一つピンと来ていません。 もしさらにご助言いただけたらとてもうれしいです。 最後にご返答を頂いてから内容を理解するのに時間を要しお礼をお送りするのが遅れて申し訳ありません。 有難うございました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • PHPでGLOBAL STATUSを取得?

    PHPのプログラム上で、global status情報を取得するにはどうすれば良いのでしょうか? MySQLへの接続にはPDOを使用しているので、PDOを使用して取得したいのですが・・・ 単純に、 $sql_global = 'SHOW GLOBAL STATUS'; $stmt_global = $dbh -> prepare($sql_global); $stmt_global -> execute(); while($value = $stmt_global->fetch(PDO::FETCH_ASSOC)) { var_dump($global); } としてみましたが、これでは全てNULLが返ってきてしまいました。 どうすれば良いか、ご存知の方がいらっしゃったら教えてください! どうぞよろしくお願いいたしますm(_ _)m

    • ベストアンサー
    • PHP
  • phpプリペアードステートメントについて質問です。

    phpの練習で、以下のようなhtmlファイルとphpファイルを作り XAMPで作業をおこなっています。 以下にあるhtml.phpファイルでのやり取りはうまくいっているのですが、 このphpをプリペアードステートメントにする所で躓いています。 いろいろ調べてやってはみたものの、どうしても%を使った あいまい検索のところがわかりません。 ---------------------------------------------------------------- 以下、プリペアードステートメントにする前の ページ内容です。こちらではうまくいっています。 html <form method="post" action="kensaku.php"> ご意見コードを入力してください。<br /> <input name="code" type="text" style="width:100px"><br /> <br /> <input type="submit" value="送信"> </form> php <?php $code=$_POST['code']; $dsn = 'mysql:dbname=phpkiso;host=localhost'; $user = 'root'; $password =''; $dbh = new PDO($dsn,$user,$password); $dbh->query('SET NAMES UTF-8'); $sql = "select * from `anketo` where `goiken` like '%{$code}%' "; $stmt = $dbh->prepare($sql); $stmt-> execute(); while(1) { $rec=$stmt->fetch(PDO::FETCH_ASSOC); if($rec==false) { break; } print $rec['code']; print $rec['nickname']; print $rec['email']; print $rec['goiken']; print '<br />'; } $dbh = null; ?> ---------------------------------------------------------------- 以上のphpの中の以下の分を $sql = "select * from `anketo` where `goiken` like '%{$code}%' "; $stmt = $dbh->prepare($sql); $stmt-> execute(); ↓ $sql ="SELECT*FROM anketo WHERE goiken like ?"; $stmt = $dbh->prepare($sql); $data[] = $code; $stmt->execute(array("%$_GET[$data]%")); こんな風に直しては見たのですが、なんだか うまくい行かずです。 よろしければ教えてください。 宜しくお願い致します。

    • 締切済み
    • PHP
  • PHPの書き方について

    PHPを独学で勉強中で、気になったことがあるので質問させていただきます。 最初に買った書籍とその次に買った書籍で書き方が違うところがあるので、普通はどちらでやるのか、また、使い分けがあるのかが知りたいです。 たとえば、データベースを1行ずつ取り出す処理で、1冊目では $pdo = new PDO($dnsinfo,$USER,$PW); $sql = "SELECT * FROM ○○"; $stmt = $pdo->prepare($sql); $stmt->execute(null); $res = ""; while($row = $stmt->fetch(PDO::FETCH_ASSOC)){ $res .= $row['△△'] ."," .$row['□□'] ."<br>\n"; } ・・・というコードがあったのですが、2冊目には同じような処理が mysqli_fetch_assoc()を使って書かれていたり、 接続の仕方も1冊目では「new PDO($dnsinfo,$USER,$PW);」を使って書かれているのが、2冊目では「mysqli_connect()」になっていたり、 他にも同じような処理がよく似たコードで書かれています。 調べてみると、PHP5.5から1冊目のやり方になった・・・ような記事を見つけたのですが、どちらの本もPHP5.5と書いてあり、いまいちよくわかりません。 詳しい方いらっしゃいましたらご教示お願いいたします。

    • ベストアンサー
    • PHP
  • 複数条件検索のWHERE句の使い方がわかりません。

    初めましてphp,mysql共に初心者です。 現在以下のような問題で頭を抱えています。 映画のデータベースを使った映画の検索システムを考えています。 フィールドはid,sakuhinmei,cast1,cast2,cast3,kantokuの6つです。 検索方法として作品名やキャストなどを一つのフォームを用いて検索する複数条件を用いたシステムを考えています。 そこで以下のようなソースを作りました。 <?php $dsn='mysql:dbname=testdb;host=localhost'; $user='root'; $password='koro0401'; $dbh=new PDO($dsn,$user,$password); $dbh->query('SET NAMES UTF-8'); $kensakuwords=$_POST['kensakuwords']; $sql="SELECT * FROM eiga WHERE (sakuhinmei=.'$kensakuwords'.) OR (cast1=.'$kensakuwords'.) OR (cast2=.'$kensakuwords'.) OR (cast3 =.'$kensakuwords'.) OR (kantoku=.'$kensakuwords'.)"; $stmt=$dbh->prepare($sql); $stmt->execute(); while(1) { $rec=$stmt->fetch(PDO::FETCH_ASSOC); if($rec==false) { break; } print$rec['id']; print$rec['sakuhinmei']; print$rec['cast1']; print$rec['cast2']; print$rec['cast3']; print$rec['kantoku']; print'<br/>'; } $dbh=null; ?> 実行してみるとエラーはでないのですが、何も表示されません。いろいろネットで調べてためしてはみたのですが、自分では何が違うのかわかりませんでした。 どうかphp、mysqlに詳しい方々、お力添えお願いします。 初心者でもわかりやすい解答をお願いします。

  • $dbh = dbConnect();

    いつもお世話になりありがとうございます。 標記の件。 エラーになります。 どう直せばいいでしょうか? エラーメッセージは Fatal error: Uncaught Error: Call to undefined function dbConnect() in C:\xampp\htdocs\blog_create.php:9 Stack trace: #0 {main} thrown in C:\xampp\htdocs\blog_create.php on line 9 です。 コーディングは下記です。 <?php //require_once('form.html'); require_once('blog.php'); $sql = "INSERT INTO table_name(name,title,category,content) VALUES (:name, :title, :category, :content,)"; $dbh = dbConnect(); $dbh->beginTransaction(); try { $stmt = $dbh->prepare($sql); $stmt->bindValue(':id', $blogs['id'], PDO::PARAM_INT); $stmt->bindValue(':name', $blogs['name'], PDO::PARAM_STR); $stmt->bindValue(':title', $blogs['title'], PDO::PARAM_STR); $stmt->bindValue(':category', $blogs['category'], PDO::PARAM_STR); $stmt->bindValue(':content', $blogs['content'], PDO::PARAM_STR); $stmt->bindValue(':post_at', $blogs['post_at'], PDO::PARAM_INT); $stmt->execute(); $stmt->commit(); echo 'ブログを投稿しました!'; } catch (PDOException $e) { $dbh->rollBack(); exit($e); } blog.php <?php //require_once('dbc.php'); //<?php //class Dbc //{ // protected $table_name; //protected function dbConnect() //{ $dsn = 'mysql:host=localhost;dbname=blog_app;charset=utf8'; $user = 'blog_user'; $pass = 'rhythm0!KT'; try { $dbh = new \PDO($dsn, $user, $pass, [ \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION, ]); } catch (PDOException $e) { echo '接続失敗' . $e->getMessage(); exit(); }; return $dbh; //} function getAll() { $dbh = $this->dbConnect(); //①SQLの準備 $sql = "SELECT * FROM $this->table_name"; //②SQLの実行 $stmt = $dbh->query($sql); //③SQLの結果を受け取る $result = $stmt->fetchall(\PDO::FETCH_ASSOC); return $result; $dbh = null; } $dbh = $this->dbConnect(); $sql = "SELECT * FROM $this->table_name"; $stmt = $dbh->prepare("SELECT * FROM $this->table_name Where id = :id"); $stmt->bindValue(':id', (int)$id, \PDO::PARAM_INT); $stmt->execute(); $result = $stmt->fetch(\PDO::FETCH_ASSOC); if (!$result) { exit('本文がありません。'); } return $result; //} //function blogCreate($blogs) { $sql = 'INSERT INTO blog(title, content, category, publish_status) VALUES (:title, :content, :category, :publish_status)'; $dbh = $this->dbConnect(); $dbh->biginTransaction; try { $stmt = $dbh->prepare($sql); $stmt->bindValue(':title', $blogs['title'], \PDO::PARAM_STR); $stmt->bindValue(':content', $blogs['content'], \PDO::PARAM_STR); $stmt->bindValue(':category', $blogs['category'], \PDO::PARAM_INT); $stmt->bindValue(':publish_status', $blogs['publish_status'], \PDO::PARAM_INT); $stmt->execute(); $dbh->commit(); echo 'ブログを投稿しました!'; } catch (PDOException $e) { $dbh->rollBack(); exit($e); } } function delete($id) { if (empty($id)) { exit('idが不正です。'); } $dbh = $this->dbConnect(); $stmt = $dbh->prepare("DELETE FROM $this->table_name Where id = :id"); $stmt->bindValue(':id', (int)$id, \PDO::PARAM_INT); $stmt->execute(); echo 'ブログを削除しました!'; return $result; } //} ?> 度々申し訳ございません。 教えてください。 ご回答のほど宜しくお願い申し上げます。

    • ベストアンサー
    • PHP
  • this->何故?エラー???

    いつもお世話になりありがとうございます。 標記の件。 26行目がどうしてもエラーになります。 エラーメッセージは Fatal error: Uncaught Error: Undefined constant "this" in C:\xampp\htdocs\dbc.php:26 Stack trace: #0 C:\xampp\htdocs\index.php(4): Dbc->getAll() #1 {main} thrown in C:\xampp\htdocs\dbc.php on line 26 です。 度々申し訳ございません。 アドバイスの程、宜しくお願い申し上げます。      記 <?php class Dbc { protected $table_name; private function dbConnect() { $dsn = 'mysql:host=localhost;dbname=blog_app;charset=utf8'; $user = 'blog_user'; $pass = 'rhythm0!KT'; try { $dbh = new PDO($dsn, $user, $pass, [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, ]); } catch (PDOException $e) { echo '接続失敗' . $e->getMessage(); exit(); }; return $dbh; } public function getAll() { $dbh = this->dbConnect();  ★ここが26行目 //①SQLの準備 $sql = "SELECT * FROM this->$table_name"; //②SQLの実行 $stmt = $dbh->query($sql); //③SQLの結果を受け取る $result = $stmt->fetchall(PDO::FETCH_ASSOC); return $result; $dbh = null; } public function setCategoryName($category) { if ($category == '1') { return '日常'; } elseif ($category == '2') { return '非日常'; } else { return 'その他'; } } public function getById($id) { if (empty($id)) { exit('idが不正です。'); } $dbh = this->dbConnect(); $stmt = $dbh->prepare("SELECT * FROM this->$table_name Where id = :id"); $stmt->bindValue(':id', (int)$id, PDO::PARAM_INT); $stmt->execute(); $result = $stmt->fetch(PDO::FETCH_ASSOC); if (!$result) { exit('本文がありません。'); } return $result; } public function blogCreate($blogs) { $sql = 'INSERT INTO blog(title, content, category, publish_status) VALUES (:title, :content, :category, :publish_status)'; $dbh = this->dbConnect(); $dbh->biginTransaction; try { $stmt = $dbh->prepare($sql); $stmt->bindValue(':title', $blogs['title'], PDO::PARAM_STR); $stmt->bindValue(':content', $blogs['content'], PDO::PARAM_STR); $stmt->bindValue(':category', $blogs['category'], PDO::PARAM_INT); $stmt->bindValue(':publish_status', $blogs['publish_status'], PDO::PARAM_INT); $stmt->execute(); $dbh->commit(); echo 'ブログを投稿しました!'; } catch (PDOException $e) { $dbh->rollBack(); exit($e); } } } ?>

    • ベストアンサー
    • PHP
  • php 多重ループでエラー

    データベースからレコードの値を取得時に、 以下のエラーが発生します。 2度目のexecute()でなぜエラーが発生するのでしょうか? Fatal error: Call to a member function execute() on a non-object <? try {  $dbh = new PDO("mysql" . ":host=localhost" . ";" . "dbname=" . "test", "user", "password");  if (!$dbh)  {   $info = $dbh->errorInfo();   exit($info[2]);  } } catch (PDOException $e) {  exit('データベースに接続できませんでした。' . $e->getMessage()); } $sql = "SELECT * FROM Master"; $result = $dbh->prepare($sql); $result->execute(); while ($rs = $result->fetch(PDO::FETCH_ASSOC)) {  $sql = "SELECT * FROM MasteSub";  $sql = $sql . " Where ID = {$rs['ID']";  $result2 = $dbh->prepare($sql);  $result2->execute(); //ここでエラー発生  if ($rs2 = $result2->fetch(PDO::FETCH_ASSOC))  {   $Name = $rs["Name"];  }  $rs2 = null;  $result2 = null; } $rs = null; $result = null; 開発環境 OS:CentOS5 PHP:5.1.6 データベース:MYSQL

    • ベストアンサー
    • PHP
  • SELECT文でエラー???何故でしょうか???

    いつも大変お世話になり誠にありがとうございます。 標記の件。 ファイルが多いので、他の箇所に誤りがあるかもしれません。 エラーメッセージは Fatal error: Uncaught Error: Object of class Blog could not be converted to string in C:\xampp\htdocs\dbc.php:55 Stack trace: #0 C:\xampp\htdocs\detail.php(4): Dbc->getById('1') #1 {main} thrown in C:\xampp\htdocs\dbc.php on line 55 です。 度々申し訳ございません。 アドバイスの程、宜しくお願い申し上げます。      記 <?php class Dbc { protected $table_name; protected function dbConnect() { $dsn = 'mysql:host=localhost;dbname=blog_app;charset=utf8'; $user = 'blog_user'; $pass = 'rhythm0!KT'; try { $dbh = new PDO($dsn, $user, $pass, [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, ]); } catch (PDOException $e) { echo '接続失敗' . $e->getMessage(); exit(); }; return $dbh; } public function getAll() { $dbh = $this->dbConnect(); //①SQLの準備 $sql = "SELECT * FROM $this->table_name"; //②SQLの実行 $stmt = $dbh->query($sql); //③SQLの結果を受け取る $result = $stmt->fetchall(PDO::FETCH_ASSOC); return $result; $dbh = null; } public function setCategoryName($category) { if ($category == '1') { return '日常'; } elseif ($category == '2') { return '非日常'; } else { return 'その他'; } } public function getById($id) { if (empty($id)) { exit('idが不正です。'); } $dbh = $this->dbConnect(); $stmt = $dbh->prepare("SELECT * FROM $this->$table_name Where id = :id"); ★ここが55行目です! $stmt->bindValue(':id', (int)$id, PDO::PARAM_INT); $stmt->execute(); $result = $stmt->fetch(PDO::FETCH_ASSOC); if (!$result) { exit('本文がありません。'); } return $result; } public function blogCreate($blogs) { $sql = 'INSERT INTO blog(title, content, category, publish_status) VALUES (:title, :content, :category, :publish_status)'; $dbh = $this->dbConnect(); $dbh->biginTransaction; try { $stmt = $dbh->prepare($sql); $stmt->bindValue(':title', $blogs['title'], PDO::PARAM_STR); $stmt->bindValue(':content', $blogs['content'], PDO::PARAM_STR); $stmt->bindValue(':category', $blogs['category'], PDO::PARAM_INT); $stmt->bindValue(':publish_status', $blogs['publish_status'], PDO::PARAM_INT); $stmt->execute(); $dbh->commit(); echo 'ブログを投稿しました!'; } catch (PDOException $e) { $dbh->rollBack(); exit($e); } } } ?>

    • ベストアンサー
    • PHP
  • SQLのUPDATEする数値の設定 PHP

    MYSQLのデータをPHPでアクセスのたびに増やすプログラムを書いているのですが上手くいきません。 require("dbinfo.php"); try{ $dbh = new PDO($dsn, $username, $password); }catch (PDOException $e) { exit('データベースに接続できませんでした。e1' . $e->getMessage()); } $sql = "SELECT * FROM wp_usermeta WHERE umeta_id = '150'"; $stmt = $dbh->query($sql); $result = $stmt->fetch(PDO::FETCH_ASSOC); $stmt -> execute(); print $a = $result[meta_value]; // 0が表示されています $a = $a +1; print $sqll = "UPDATE wp_usermeta SET meta_value = '$a' WHERE umeta_id = '150'"; $stmtl = $dbh->prepare($sqll); $stmtl -> execute(); デフォルト値を0に設定してアクセスし、一度アクセスするごとに1ずつ増えていくことを予想していたのですが、1度目のアクセスで3になり、その後は1づつ増えていきます。 アクセス毎に増えていくプログラムをつくる場合はUPDATEよりも他の書き方の方が良いのでしょうか。 宜しくお願いします。

    • ベストアンサー
    • PHP
  • 特定のレコードだけを表示させるためのコード

    ●質問の主旨 kensaku.htmlから数字(データベースのコード番号)を入力・検索して、 PHPMyAdminにあるデータベースから、特定のレコードを取り出したいのですが、 データベースにあるすべてのデータが返されます。 検索窓に入力した特定のレコードの内容だけを 返すためには、下記のichiran.phpをどのように直せばよいでしょうか? ●プログラムの流れ 1.kensaku.htmlの検索窓に番号を入力・送信 2.PHPMyAdminにあるデータベース(aketo)にアクセス 3.ichiran.phpで検索結果を表示 ●プログラムコード (kensaku.html) <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>PHPの基礎</title> </head> <body> <form method="post" action="kensaku.php"> ご意見コードを入力してください。<br/> <input name="code" type="text" style="width:100px"><br/> <br/> <input type="submit" value="送信"><br/> </body> </html> (ichiran.php) <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>PHPの基礎</title> </head> <body> <?php $code=$_POST['code']; $dsn = 'mysql:dbname=phpkiso2;host=localhost'; $user = 'root'; $password = ''; $dbh = new PDO($dsn,$user,$password); $dbh->query('SET NAMES UTF-8'); $sql = 'SELECT * FROM anketo WHERE code='.$code; $stmt = $dbh->prepare($sql); $stmt->execute(); $stmt->execute(); while(1) { $rec = $stmt->fetch(PDO::FETCH_ASSOC); if($rec == false) { break; } print$rec['code']; print$rec['nickname']; print$rec['email']; print$rec['goiken']; print'<br/>'; } $dbh = null; ?> </body> </html> ●開発環境 windows8 xammp1.8.1 MySQL(PHPMyAdmin)

    • ベストアンサー
    • MySQL