MySql - Как ORDER BY условно на основе количества возвращаемых строк? - PullRequest
0 голосов
/ 24 октября 2018

Предположим, у меня есть таблица USERS, и я хочу вернуть 10 USERS, чей статус не равен ACTIVATED.Но я хочу отсортировать вывод по количеству возвращенных строк, например, если количество возвращенных строк больше 10, тогда я хочу order by id, иначе я хочу order by date created:

SELECT * FROM USERS
WHERE status != 'ACTIVATED'
ORDER BY 
    CASE 
      WHEN (SELECT COUNT(ID) FROM USERS WHERE status != 'ACTIVATED') > 10 THEN id
      ELSE created
    END
ASC
LIMIT 10

Обратите внимание, чтонам нужно привести id к INT в операторе CASE, иначе он сортирует id как строку.

Ответы [ 2 ]

0 голосов
/ 24 октября 2018

С вашей стороны произошла синтаксическая ошибка, поэтому я быстро исправил ваш запрос, чтобы ограничить трудности.Обратите внимание на условие CASE и его дополнительные скобки:

SELECT 
    * 
FROM USERS
WHERE 
    status != 'ACTIVATED'
ORDER BY
    CASE
        WHEN ((select count(ID) FROM USERS WHERE status != 'ACTIVATED') > 10) then id
        ELSE created
    END
    ASC
LIMIT 10

EDIT : также договорились о практике создания отдельного представления для каждого действия чтения, которое можно объединить в другое) запросы.Т.е. отдельное представление:

CREATE VIEW 'my_view' as 
SELECT *
FROM USERS
WHERE 
    status != 'ACTIVATED'

Используя представления, вы можете дополнительно оптимизировать выполнение sql и сделать его несколько более простым в целом.Это особенно важно, когда вам нужно объединить такие представления с другими, более сложными представлениями.

Я быстро добавил пример синтаксиса представления, так что он не готов к производству или желаемый шаблон для использования при созданииviews. Большинство созданных представлений также определяют определитель безопасности, вызывающие программы, в более старых версиях mysql (и mariadb и других форках mysql) люди также указывают, использовать sql_cache или нет и т. д.

0 голосов
/ 24 октября 2018

Создайте представление и затем используйте его в выписке:

CREATE VIEW result AS
SELECT * FROM USERS
WHERE status != 'ACTIVATED'
ORDER BY 
  CASE 
    WHEN (SELECT COUNT(*) FROM result) > 10 THEN id
    ELSE created
  END
ASC
LIMIT 10
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...