2015-05-22 2 views
2

Вот пример таблицы:Как получить верхние 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. Выполняем ли я его перед или после того, как я выбираю те, которые имеют подходящий тип категории (качество работы)?

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

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

+0

Зачем исключать все, что не является, а не включать все, что есть? – verhie

+0

Потому что я люблю наказать себя. :) Кроме того, он не прерывает мой ход мыслей. – Vulkan

ответ

3

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

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

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

Пример 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

+1

Это почти кажется слишком легким, не так ли? – Strawberry

Смежные вопросы