組み合わせのマッチィングを過去のものと重複させない
ある研究の素材マッチングで過去に比較したものを重複させないでテストする組み合せを表示するプログラムを作りたいと思っています。
DB table tests
id material test1 test2 test3
1 | A | 1 | 1 | 0
2 | B | 0 | 1 | 0
3 | D | 0 | 0 | 1
4 | E | 1 | 0 | 0
5 | F | 0 | 0 | 0
6 | G | 0 | 1 | 1
このテーブルによると素材Aはtest1とtest2に参加しておりそのどちらかに参加している素材B,素材Gとは再び同じtestに参加する必要がなく
test1とtest2に参加していない素材D,素材Fはtest4で素材Aとマッチさせることができるという事を表示できるものを作りたいです。
考えましたのは、
$sql='SELECT material,test1,test2,test3 FROM tests WHERE id=?';
$stmt=$dbh->prepare($sql);
$stmt->execute(array($id));
$rec=$stmt->fetch(PDO::FETCH_ASSOC);
$material=$rec[material];
$test1=$rec[test1];
$test2=$rec[test2];
$test3=$rec[test3];
これでどの素材がどのテストに参加したかを求めその次のtest4でいままでマッチしていない素材のグループを作るには
$material=$_POST[material];
$sql="SELECT material FROM tests WHERE $material !=? and test1 !=? and test2 !=? and test3 !=?";
$stmt=$dbh->prepare($sql);
$stmt->execute(array($material,$test1,$test2,$test3));
while( $rec=$stmt->fetch(PDO::FETCH_ASSOC) );
$material=$rec[material];
{
echo $material;
echo '<br>';
}
と言う形で書けるかと思うのですが、この方法ですとtest(testと素材の数は次々増えていきます)が増えるたびにデータベースのカラムを足しPHPのsql文を書き足さないといけなくなります。
カラムを増やしていく事があまりいい事ではない様に解釈しています。また都度PHPを書き足すのもどうかという事で設計上改善が必要かと思っていますがその改善案にたどり着くことができません。
なにかより良い設計(PHPの書き方、およびDB設計)がありましたらどうぞどなたかお知恵をお貸しください。
どうぞよろしくお願いいたします。