2015-05-31 2 views
0

У меня есть таблица с 4-мя колонками:Условное упорядочение с приоритетом в колонке

  1. ProductID
  2. IsSponsored
  3. Ранг
  4. PopularityScore

Я хочу, чтобы получить 20 лучших продуктов по заказу от Rank и PopularityScore. Однако Rank учитывается, только если IsSponsored = 1. Я пробовал использовать CASE в статье ORDER BY. Что-то вроде:

SELECT ProductID 
FROM ProductTable 
ORDER BY 
CASE WHEN IsSponsored = 1 THEN RANK END ASC, 
CASE WHEN IsSponsored = 0 THEN PopularityScore END DESC 
LIMIT 20; 

Проблемы я столкнулся это, так как числа строк с IsSponsored = 0 >> числа строк с IsSponsored = 1 и пределом 20, MySQL извлекает строки с IsSponsored = 0 заказанных PopularityScore. То, что я хочу, это получить от всех Спонсированных продуктов, заказанных по Ранкам, а затем дополненных не спонсируемыми продуктами, заказанными по рейтингу популярности.

ответ

1

Попытка условной логики на всех трех:

ORDER BY (IsSponsored = 1) DESC, 
     (CASE WHEN IsSponsored = 1 THEN RANK END) ASC, 
     PopularityScore DESC; 

Первый ключ является выражением на логическое значение: это имеет значение истина (1) или ложь (0). Я удалил CASE с третьего ключа, потому что он избыточен - вы можете вернуть его, если хотите.

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