2012-04-02 3 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%. , но тогда мне нужен запрос, который выглядит примерно так:

«Ищите элемент x в itemA AND itemB, и когда вы его найдете, получите его пару. Когда у вас есть все пары, сортируйте их по их отношению к элементу x , и выберите верхнюю 500. "

A. Как вы думаете, это на самом деле сделает использование таблицы более эффективным?

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 

Или, возможно,

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 
Смежные вопросы