それで、私が遭遇した興味深い問題。簡単な解決策があると確信していますが、それが何であるかはわかりません。:)
基本的に、次のような非常に単純なデータベースを想像してください。
----------------
T1
----------------
r | nID
---------------
1 | A
2 | B
----------------
----------------
T2
----------------
nID | val
---------------
A | XXX
B | L
B | M
B | N
B | P
----------------
基本的に、表 2 は表 1 を参照します。ここで、A または B からランダムな行を選択したいと思います。ただし、最初に A と B をランダム化し、次に関連する値を選択したいと思います。
つまり、コインを投げXXX
ます。尾、L, M, N,
またはP
。
私の現在のクエリは、2 つのテーブル、 orders by RAND()
、 then を結合しますLIMIT 1
。ただし、これにより、B 値が選択される確率が、A 値が選択される確率よりもはるかに高くなります。私はPHPを使用しているので、2つのクエリを実行するだけで簡単に実行できますが、1つのクエリを実行する方がはるかに整理されるので、皆さんの推奨事項を確認したいと思います.
解決策はありますか?=)
編集:
これが私の現在のクエリですが、機能していません。理由がわからない!
SELECT *
FROM t2
WHERE
nID =
(
SELECT nID
FROM t1
ORDER BY RAND()
LIMIT 1
)
ORDER BY RAND()
LIMIT 1
編集2:
私が抱えている問題を実証するために、テスト ケースを作成しました。まず、次のテーブルを作成しました。
を選択する確率を、 、、、またはを選択する確率XXX
と同じにしたい。私が持っているクエリはそれを行うべきですよね?だから私はそれをテストしました。次のスクリプトは、クエリを 5000 回実行し、結果をカウントします。それらは約 50 ~ 50 で、約 2500 回表示され、他のすべてのものも約 2500 回表示されます。L
M
N
P
XXX
$a = 0;
$b = 0;
$i = 0;
while ($i < 5000)
{
$query = mysql_query("
SELECT *
FROM t2
WHERE
nID =
(
SELECT nID
FROM t1
ORDER BY RAND()
LIMIT 1
)
ORDER BY RAND()
LIMIT 1
") or die(mysql_error());
$result = mysql_fetch_array($query);
if ($result['val'] == 'XXX')
{
$a++;
}
else
{
$b++;
}
$i++;
}
echo "XXX - $a<br />";
echo "Other - $b<br />";
結果は次のとおりです。
XXX - 937
Other - 4063
もう一度実行してみましょう。
XXX - 968
Other - 4032
そして、もう一度実行してみましょう。
XXX - 932
Other - 4068
これは、私のクエリで予想される 50 対 50 の分割ではありません。一体何が起こっているのですか?助けてくれてありがとう、みんな!