私はこれを理解しようとしている年を探しました。私はボウリングブラケットを走らせるためのブラケットランニングシステムを構築しようとしています。重複のないペアリングのグループを生成する、PHPとmysql
私はID列とBowlerID列を持つテーブルを持っています。それをbowling_bracket_entriesと呼んでください。 IDはユニークですが、同じBowlerIDのエントリが8〜1個の範囲で複数存在することがあります。私がしたいのは、BowlerIDの行からペアを作ることですが、同じペアを繰り返すことはありません。それらのペアリングから、4組のグループに入れ、BowlerIDは4組のグループ内で繰り返されません。
ボーリングの構造。ブラケットのエントリテーブル ID | BowlerID
766 151
767 230
768 201
769 202
770 140
771 205
772 62
773 75
774 56
775 140
759 129
760 60
761 165
762 223
763 145
764 131
765 145
704 197
705 230
706 202
707 167
708 223
709 205
710 217
711 217
712 56
713 60
714 141
715 60
716 193
717 181
718 217
719 75
720 218
721 151
722 223
723 202
724 197
725 140
726 220
727 203
728 56
729 62
730 218
731 160
732 205
733 141
734 167
735 165
736 151
737 205
738 224
739 203
740 142
741 181
742 60
743 60
744 218
745 217
746 224
747 160
748 218
749 223
750 203
751 193
752 202
753 62
754 60
755 142
756 201
757 151
758 203
私は、変数を作成し、次のペアリング(すなわち36〜92)を引き、ランダムに2つのBowlerID年代を選択し、ペアリングテーブルに挿入、その後、(すなわち22〜100)区切り文字でそれらを一緒に入れてみましたそのペアの逆(つまり92〜36)を探し、ペアリングテーブルに一致する値がないか見つからない場合は挿入し、EntriesテーブルからそれらのBowlerIDのIDを削除し、値が不足するまで繰り返す。問題は時々私はBowlerIDを自分自身とペアにすることです。時には、私はBowlerIDが自分自身とペアになっていない完全なリストを得るでしょう。
SELECT bracket_entries.ID, bracket_entries.BowlerID FROM bracket_entries ORDER BY rand() LIMIT 2
そして、それらを一緒に入れて、ペアリングを作成する(すなわち36〜68)
$i = 0;
while($pairing=$rsNewPair->fetch_assoc()) {
//Build Pairing List
$thisPairing .= $pairing['BowlerID'];
$IDS .= $pairing['ID'];
$i++;
if($i < 2){
$thisPairing .= "~";
$IDS .= "~";
}
}
$flipFlop = explode('~', $thisPairing);
$reversePairing = $flipFlop[1].'~'.$flipFlop[0];
if($flipFlop[0] == $flipFlop[1]){
header("Refresh:0");
}
そして、そこにすでにあるものと比較します。
SELECT bracket_pairings.Pairing FROM bracket_pairings WHERE bracket_pairings.Pairing = '".$thisPairing."' OR bracket_pairings.Pairing = '".$reversePairing."'"
それが何かを見つけるしない場合は、ペアリングテーブルにペアリングを挿入し、bracket_pairingsから次の2
bowling_bracket_pairingsテーブル構造
1 203~218
2 193~218
3 217~129
4 201~60
5 60~141
6 141~165
7 197~202
8 230~203
9 220~167
10 60~62
11 151~140
12 151~230
13 193~205
14 60~140
15 217~223
16 203~142
17 60~205
18 197~151
19 205~201
20 218~62
21 56~223
22 217~167
23 56~202
24 217~75
25 224~223
26 160~203
27 151~60
28 131~145
29 140~205
30 202~75
31 62~160
32 142~181
33 224~181
34 145~223
35 165~56
36 218~202
SELECT
PairingID, SUBSTRING_INDEX(Pairing, '~', 1) AS entry1,
SUBSTRING_INDEX(SUBSTRING_INDEX(Pairing, '~', 2), '~', -1) AS entry2
に移動
次に、whileループを使用してペアを括弧で表示し、各エントリを4つのペアの配列に押し込んでいっぱいになるまで押し込み、次に比較してユーザーは重複しません。
while(($pairings=$rsEntries->fetch_assoc())&&($loop < 5)){
$thisBowlerID1 = $pairings['entry1'];
$thisBowlerID2 = $pairings['entry2'];
if((!in_array($thisBowlerID1, $thisBracket)) || (!in_array($thisBowlerID2, $thisBracket))){
while($players=$rsPlayers->fetch_assoc()){
if($players['BowlerID'] == $thisBowlerID1){
echo $players['BowlerID'].'<br>';
//echo $players['Name'].'('.$players['CurrentAvg'].')<br>';
}
} mysqli_data_seek($rsPlayers, 0);
array_push($thisBracket, $thisBowlerID1);
while($players=$rsPlayers->fetch_assoc()){
if($players['BowlerID'] == $thisBowlerID2){
echo $players['BowlerID'].'<br><br>';
//echo $players['Name'].'('.$players['CurrentAvg'].')<br><br>';
}
} mysqli_data_seek($rsPlayers, 0);
array_push($thisBracket, $thisBowlerID2);
$removeSQL="DELETE FROM bracket_pairings WHERE bracket_pairings.PairingID = ".$pairings['PairingID'];
$removePairing = $connAdmin->query($removeSQL);
$loop++;
}
$thisBracket = array();
}
}
私は、私は4(8個のエントリ)のグループに入れしようとすると、9つのブラケットを埋めるように見えることはありません72個のエントリを持っているだけで約7.5、その後に左のペアのランダムな組み合わせを残しますテーブルは配置されていないが、まだ私は開口部を持っています。
Bracket 1
62
141
142
151
131
218
140
56
Bracket 2
145
201
193
160
56
205
129
203
Bracket 3
167
75
217
201
224
217
230
140
Bracket 4
60
193
203
197
141
167
223
220
Bracket 5
60
165
202
142
181
60
202
202
Bracket 6
205
140
62
218
217
60
230
223
Bracket 7
165
223
205
218
205
75
56
151
Bracket 8
202
203
あなたは結果を見ることができるように
結果は8未充填のままにしておきます。すべての5つ目はスキップされた理由
5 197~218
10 60~223
15 181~62
20 203~60
25 160~217
30 151~151
35 145~224
わからない:ここで
は、その含まれていませんでした上で残っているものです。私は正しい方向に進んでいると思いますが、私が持っている問題を解決する方法を理解するための助けやアイデアは素晴らしいでしょう。
あなたの質問を編集して、あなたのテーブル 'Entries'と' Pairing'の完全なテーブル仕様を含んでいるようにしてください。特にあなたが 'UserID'カラムについて話しているが、あなたのクエリは代わりに' BracketId'を使うからです。また、テーブル名は、説明とSQLクエリの間で同じではないようです。また、72個のエントリの完全な例と、それらを9括弧で記入する方法を追加してください。 72の初期エントリがどのように満たされるのかを説明します。たぶん、同じ72の項目を持つ9つの括弧の中に別の詰め物が表示されているかもしれませんが、それは間違ってペアになっています(そしてその行にマークを付けます)。 – Progman
私は質問を更新しました。うまくいけば、少し良くなっていることが分かりました。助けてくれてありがとう – user3338040