2012-04-02 2 views
0

나는이 표를 가지고 :복잡한 MySQL의 쿼리 정렬 및 페어링

itemA itemB relation 

1  2  0.4 
1  3  0.8 
2  1  0.4 
2  3  0.6 
3  1  0.8 
3  2  0.6 

그것은 10m 행 테이블과 계산, 그리고 당신이 보는대로, 중복 정보를 많이있다.

SELECT itemB WHERE itemA=1 ORDER BY relation DESC LIMIT 1 
// in this case - 3 

만 실제 생활에서 내 한계는 1 만 500 아니다, 그래서 내가 쿼리 항목에 가장 높은 '관계'값이 500 개 항목을 얻을 :이 같은이 테이블을 사용합니다.

나는 테이블 아래로 축소 고려 제거하고있어 중복 :

itemA itemB relation 

1  2  0.4 
1  3  0.8 
2  3  0.6 

이 50 % 테이블 크기를 줄일 수 있습니다. 그런데 이런 식의 쿼리가 필요합니다. -

"itemA AND itemB에서 항목 x를 찾아서 찾으면 쌍을 얻습니다. 모든 쌍이 있으면 항목 x와의 관계로 정렬하십시오. 상위 500 개를 선택하십시오. "

가. 이것이 실제로 테이블 사용을 더 효율적으로 만들 것이라고 생각합니까?

B.이 쿼리는 어떻게 표시되어야합니까?

+0

될 수 있을까요? 일치하는 항목에 대해 이야기하고 있습니까? 중복에 대해 계산 열을 저장할 수 없습니까? 그렇지 않으면 속도를 향상시키기 위해 [index] (http://stackoverflow.com/questions/1108/how-does-database-indexing-work) 데이터베이스를 원할 수 있습니다. –

답변

2

A.이를 확인하는 가장 좋은 방법은 몇 가지 테스트 테이블을 설정하고 잠재적 인 쿼리를 벤치 마크하는 것입니다.

B. 당신이 할 수있는 방법에는 여러 가지가 있습니다. 하나는

SELECT DISTINCT LEAST(itemA,itemB),GREATEST(itemA,itemB),relation 
FROM `table` 
WHERE itemA = 1 
    OR itemB = 1 
ORDER BY relation DESC 
LIMIT 500 

아니면 "는 한 쌍의"GET 무슨 뜻 이죠 가능성이

SELECT otherItem,relation FROM 
(
    SELECT itemB as otherItem,relation 
    FROM `table` 
    WHERE itemA = 1 
) UNION DISTINCT (
    SELECT itemA as otherItem,relation 
    FROM `table` 
    WHERE itemB = 1 
) as combined_items 
ORDER BY relation DESC 
LIMIT 500