Как я могу получить верхние N записей таблицы MySQL, исключив массив групп?

Вот пример таблицы:

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
  1. Как передать массив исключенных категорий как оператор WHERE?
  2. Как мне упорядочить его по возрастанию / убыванию популярности?
  3. Я заказываю это до или после того, как я выберу те с правильным типом категории (мудрость работы)?

Мне все равно, если ответ упорядочен или нет по популярности. Это то, что я могу переделывать сторона клиента.

Я знаю, что это материал на уровне ядра, но есть ли способ ускорить его? Это ведь сканирование всей таблицы!

2

Решение

Вы можете сделать это с LIMIT все, что вам нужно сделать, это убедиться, что ваш WHERE предложение отфильтровывает категории, которые вы не хотите. Попробуй это:

SELECT *
FROM myTable
WHERE category NOT IN(category, list)
ORDER BY popularity DESC
LIMIT 3;

Вы пройдете по списку, найдя способ создать список категорий, разделенных запятыми, которые вы хотите отфильтровать. Для получения дополнительной информации о IN оператор, см. этот ссылка на сайт.

Вот SQL Fiddle пример, который показывает оба ваших примера.

3

Другие решения

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

3

По вопросам рекламы [email protected]