그래서 재미있는 문제가 생겼습니다. 나는 쉬운 해결책이있을 것이라고 확신하지만 그것이 무엇인지는 잘 모르겠습니다. :)MySQL GROUP BY rand()?
기본적으로, 그래서 같이 아주 간단한 데이터베이스를 상상 :
이----------------
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
.
내 현재 쿼리가 RAND()
, 다음에 LIMIT 1
의 두 테이블을 조인합니다. 그러나, 이것은 A 값이 선택 될 확률보다 B 값의 가능성이 훨씬 더 많이 선택되도록합니다. 저는 PHP를 사용하기 때문에 두 개의 쿼리를 쉽게 실행할 수 있습니다. 그러나 하나의 쿼리를 실행하는 것이 훨씬 더 정돈되어 있으므로 여러분이 추천하는 것을보고 싶습니다.
모든 솔루션? =)
편집 :
여기에 내 현재 쿼리하지만이 작동하지 않습니다. 왜 그런지!
SELECT *
FROM t2
WHERE
nID =
(
SELECT nID
FROM t1
ORDER BY RAND()
LIMIT 1
)
ORDER BY RAND()
LIMIT 1
편집 2 :
나는 데 문제를 설명하기 위해 테스트 케이스를 만들었습니다.
내가 L
, M
, N
, 또는 P
을 선택하는 동일한 것으로 XXX
를 선택하는 확률을하려면 첫째, 나는 다음과 같은 테이블을 만들었습니다. 내가 가지고있는 질의가 그것을해야한다, 그렇지? 그래서 나는 그것을 시험했다. 다음 스크립트는 쿼리를 5000 번 실행하고 결과를 계산합니다. 그들은 약 50-50이어야하며 XXX
은 약 2500 번, 그 외 모든 것은 약 2500 번 나타납니다.
XXX - 937
Other - 4063
은 이제 다시 실행하자
$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 - 968
Other - 4032
그리고 한 번 더 실행 해 봅시다.
XXX - 932
Other - 4068
이것은 내 쿼리에서 볼 때 거의 50-50으로 나뉩니다. 지구상에서 무슨 일이야? 도와 줘서 고마워!
PHP에서 mt_rand를 사용하여 랜덤 화를 시도 할 수 있습니까? 그것을 더 나은 무작위 값을 줄 수 있다고 가정? – sree
전적으로 MySQL에서 이것을하고 싶습니다. 결과의 불균형 분포는 B 값보다 A 값이 적기 때문입니다. – Nathanael
시연 할 테스트 케이스를 실행했습니다. 위 참조.^ – Nathanael