에 의해 순서, 비교 얼마나 많은 다른 사용자와 사용자 등과 같은 과일 등 ID 1, 가장 일치하는 사람을 세어 내림차순으로 결과를 표시합니다.MySQL은 <p></p> 내가 비교하려는 .. 카운트
사용자 :
1 jack
2 john
3 jim
과일 :
id, title
1 apple
2 banana
3 orange
4 pear
5 mango
관계 : 2 개 인덱스 (USER_ID, fruit_id) 및 (fruit_id, USER_ID)
user_id, fruit_id
1 1
1 2
1 5
2 1
2 2
2 4
3 3
3 1
예상 결과 : (과 비교 Jack이 좋아하는 과일 (user_id = 1))
user_id, count
1 3
2 2
3 1
검색어 :
SELECT user_id, COUNT(*) AS count FROM relations
WHERE fruit_id IN (SELECT fruit_id FROM relations WHERE user_id=1)
GROUP BY user_id
HAVING count>=2
더 많은 "최적화"쿼리
SELECT user_id, COUNT(*) AS count FROM relations r
WHERE EXISTS (SELECT 1 FROM relations WHERE user_id=1 and r.fruit_id=fruit_id)
GROUP BY user_id
HAVING count>=2
2 경기의 최소 수있다. (미래에 필요)
설명 :
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY r index NULL uid 8 NULL 15 Using where; Using index
2 DEPENDENT SUBQUERY relations eq_ref xox,uid xox 8 r.relations,const 1 Using where; Using index
모든 내가
그럼 내가 볼 카운트 DESC BY ORDER를 사용하려고 할 때까지 잘 작동 : 일시적으로 사용; filesort 사용
임시 테이블이나 파일을 사용하고 싶지 않습니다. 미래에는 데이터베이스가 높은 부하를 받아야하기 때문입니다.
저는 이것이 SQL이 정의되고 작동되는 방식입니다. 그러나 나는 다른 방법으로 그것을하는 방법을 알아낼 수 없다? 임시 테이블 및 파일을 사용하지 않습니다.
가장 많이 일치하는 사용자를 먼저 표시해야합니다.
제발 도와주세요.
UPD : Walker Farrow (파일롯을 사용하는 쿼리)에서 몇 가지 테스트를 수행했습니다.
20,000 rows - avg 0.05 seconds
120,000 0.20 sec.
1,100,000 2.9 sec.
실망스러운 결과. 테이블 구조를 변경하는 것은 가능할 것입니다.하지만 이러한 계산 및 정렬을 통해 - 어떻게해야할지 모르겠습니다.
이 작업을 수행하는 방법에 대한 제안 사항이 있습니까? 아마
글쎄, 문제가되지 않는다면 프로그래밍 언어 부분에서 정렬 메커니즘을 바꿀 수 있습니다. – Prateek
예, 소수의 결과 만 있다면 쉽게 될 것입니다. 문제는 사용자 수 (일치 항목 수)입니다. 여러 페이지에 걸쳐 데이터를 표시하는 중 ... –
글쎄, 아마도이 답변은 [SQL 쿼리 최적화 임시 테이블을 피하기 위해] 도움이 될 수도 있습니다 (http://stackoverflow.com/questions/11896271/sql-query-optimization-to-avoid-temporary). -표). – Prateek