Сложный MySQL запрос: сортировка и сопряжение - PullRequest
0 голосов
/ 02 апреля 2012

У меня есть эта таблица:

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

Это таблица и счетчик 10-метровых строк, и, как видите, много дублирующейся информации. Я использую эту таблицу следующим образом:

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 И itemB, и когда вы его найдете, получите его пару. Когда у вас есть все пары, отсортируйте их по их связи с элементом x и выберите верхнюю 500."

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

B. Как должен выглядеть этот запрос?

1 Ответ

2 голосов
/ 02 апреля 2012

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...