Вот пример таблицы:
Table: websites
Domain | Category | Popularity
google.com | 0 | 13,430
yahoo.com | 0 | 1,094
facebook.com | 1 | 23,943
youtube.com | 2 | 17,320
imdb.com | 3 | 6,094
stackoverflow.com | 4 | 2,930
ebay.com | 5 | 5,748
yandex.com | 5 | 3,748
Я хотел бы вернуть лучшие результаты N, исключив категории CE = [C1, C2, C3 … Cn], упорядоченные по популярности.
Например:
ТОП 3 результатов, исключая поисковые системы CE = [0], упорядоченные по популярности:
Domain | Category | Popularity
facebook.com | 1 | 23,943
youtube.com | 2 | 17,320
imdb.com | 3 | 6,094
Результаты ТОП 3, исключающие все категории, кроме поисковых систем CE = [1, 2, 3, 4, 5], упорядоченные по популярности:
Domain | Category | Popularity
google.com | 0 | 13,430
yahoo.com | 0 | 1,094
Давайте работать над последним запросом.
Я ожидаю, что это будет выглядеть так:
SELECT domain, category, popularity FROM (SELECT domain, category, popularity FROM websites WHERE category != [1, 2, 3, 4, 5] ORDER BY popularity) LIMIT 0, 3
Мне все равно, если ответ упорядочен или нет по популярности. Это то, что я могу переделывать сторона клиента.
Я знаю, что это материал на уровне ядра, но есть ли способ ускорить его? Это ведь сканирование всей таблицы!
Вы можете сделать это с LIMIT
все, что вам нужно сделать, это убедиться, что ваш WHERE
предложение отфильтровывает категории, которые вы не хотите. Попробуй это:
SELECT *
FROM myTable
WHERE category NOT IN(category, list)
ORDER BY popularity DESC
LIMIT 3;
Вы пройдете по списку, найдя способ создать список категорий, разделенных запятыми, которые вы хотите отфильтровать. Для получения дополнительной информации о IN
оператор, см. этот ссылка на сайт.
Вот SQL Fiddle пример, который показывает оба ваших примера.
select *
from websites
where Category in (1, 2, 3, 4, 5)
order by Popularity desc
limit 0,3;
даст вам 3 самых популярных домена, которые находятся в категории 1,2,3,4 или 5
select *
from websites
where Category not in (1, 2, 3, 4, 5)
order by Popularity desc
limit 0,3;
даст вам 3 самых популярных домена, которые не относятся к категории 1,2,3,4 или 5