2011-12-07 2 views
2

2 개의 테이블이 있습니다. '그룹'및 '값'.SQL 임의의 행을 선택할 때 도움말 가입

SELECT * 
FROM groups as g 
inner JOIN 
(
SELECT * FROM values as v WHERE v.groupid = g.id ORDER BY RAND() LIMIT 1 
) AS rv ON rv.groupid = g.id 

V 나던 내가 일을 할 수있는 방법 g에 대한 액세스 권한을 갖고있는 것 같다 : 나는 values.groupid = groups.id

내가 가진 쿼리는 값 테이블에서 하나 개의 임의 행을 선택하려고 이 주변? 무작위에 관해서는, 나는 단지 value.id의 삭제 될 수 있기 때문에 일하는 한계 1 해결책을 얻을 수 있었고 작은 테이블 (최대 200 행만 가능)이었습니다. 조인 만 사용하고 조인 내부에 where 절이 없으면 모든 그룹에서 임의의 값을 선택하거나 아무 것도 반환하지 않습니다. 누구든지 나를 도울 수 있습니까?

편집 : 이 늘 작업 중 하나를 내가하지만, 아무도 실제로 각 그룹의 값에 가입을하려고하지 않습니다 매우 유사한 다른 많은 질문을 참조

SELECT g.* 
,(SELECT * FROM v ORDER BY RAND() LIMIT 1) 
FROM groups AS g 
JOIN 
(
    SELECT * FROM values 
) AS v ON v.groupid = g.id 

이 시간 외부에서 V를 액세스 할 수 없기 때문에 효과 .. 제가 누락 된 사람이라면 그냥 언급 해주세요. 나는 문제를 삭제할 것이고, 나는 계속해서 다른 사람들을 볼 것입니다. 그러나 뜻있는 시간에 나는 여전히 도움이 필요합니다. 데이터 집합 정말 작은하지 않는 한

+0

다음은

난 그냥 테스트 솔루션을, 그리고 각 그룹에서 한 임의의 행을 선택하기 위해 노력/blog/2009/08/11/mysql-select-random-row-with-join/ – Chris

+0

값 테이블에 "기본"키 식별자가 있습니까? 그렇다면 열 이름이 무엇입니까? – DRapp

답변

1
SELECT u.login, a.filename FROM users u 
JOIN (SELECT filename, user_id, id AS rand_id FROM assets ORDER BY RAND()) a 
ON u.id = a.user_id 
WHERE a.filename IS NOT NULL 
GROUP BY user_id 
ORDER BY u.login; 
4

난 항상 SQL과 ORDER BY RAND()을 사용하지 마십시오, 그것은 끔찍한 성능을 야기 감사합니다. 그리고 데이터 집합이 작 으면 모두 행을 응용 프로그램으로 가져 와서 임의의 행을 선택하는 것이 좋습니다. 난 그냥 지금 http://recursive-design.com 노력하고, 나는이 솔루션 생각

SELECT g.*, v.* 
FROM Groups AS g 
INNER JOIN (
    SELECT groupid, COUNT(*) AS c, 1+FLOOR(RAND()*COUNT(*)) AS random 
    FROM `Values` GROUP BY groupid 
) AS c ON g.id = c.groupid 
INNER JOIN (SELECT @g:=0, @r:=0) AS init 
INNER JOIN (
    SELECT IF(groupid<>@g, @r:=1, @r:[email protected]+1) AS rank, @g:=groupid AS groupid, value 
    FROM `Values` 
    ORDER BY groupid 
) AS v ON g.id = v.groupid AND c.random = v.rank 
+0

나는이 쿼리의 90 %를 이해하고 있으며, 더 나은 쿼리를 제공하는 것이 매우 영리하다는 것을 알았습니다. 쿼리가 꽤 길고 읽기가 힘들어 확장 할 때 어려울 수 있지만 여전히 훌륭합니다. 그러나 애플리케이션에로드를 적용하는 것에 대해 이미 좋은 점을 알았으므로 모든 3 가지 솔루션을 다음과 같이 테스트 할 것입니다. 데이터베이스가 매우 활동적 일 때 퍼포먼스는 확실히 게임 체인저가 될 수 있습니다. 고마워, C – Chris