所以,我遇到了有趣的问题。我确信有一个简单的解决方案,但我不确定它是什么。:)
基本上,想象一个非常简单的数据库,如下所示:
----------------
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
.
我当前的查询连接了两个表,orders by RAND()
,然后是LIMIT 1
。但是,这使得选择 B 值的可能性比选择 A 值的可能性大得多。我正在使用 PHP,所以我可以轻松地运行两个查询,但是运行一个查询会更整洁,所以我想看看你们推荐什么。
有什么解决办法吗?=)
编辑:
这是我当前的查询,但它不起作用。不知道为什么!
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 分裂。这到底是怎么回事?谢谢你们的帮助,伙计们!