MySQL множественный порядок (вид вложенный)

Странная проблема в том, что она работает, но я не понимаю, почему. Я надеюсь узнать, почему это работает.
Я искал в сети и stackOverflow ответ, но не могу найти один
(Я вышел с этим кодом методом проб и ошибок …)

Я пытался заказать по 3 колонки.

Я хотел, чтобы результаты из первых двух столбцов были смешаны вместе, но сначала, а затем все результаты, упорядоченные по третьему столбцу (дата)

Это основная структура таблицы базы данных:

  • HomePage = логическое значение,
  • FeaturedProfile = логический
  • Имя = строка
  • DateModified = дата

ПРИМЕЧАНИЕ. HomePage и FeaturedProfile могут иметь значение 0 (поэтому любые результаты, которые оба равны 0, должны быть ниже (и есть!))

Это код SQL, который работает:

SELECT DISTINCT
HomePage, Profile, Name
FROM tProfiles
ORDER BY (HomePage = 0 AND FeaturedProfile = 0), e.DateModified DESC

это ORDER BY, который я не понимаю, так как моя логика сказала бы использовать 1, а не 0 +, я не уверен, что делают скобки, либо, как я предполагаю, сработало бы нижеприведенное (как в PHP SUM) и кажется более логичным для меня.

ORDER BY (HomePage, FeaturedProfile), e.DateModified DESC

Надеюсь, что этот вопрос разрешен, так как он беспокоит меня, почему это работает, и я хотел бы узнать это для дальнейшего использования ….

Заранее спасибо, и я буду рад отметить любого, кто может помочь мне понять это!

0

Решение

Первое выражение в вашем предложении ORDER BY, т.е.

(e.HomePage = 0 AND e.FeaturedProfile = 0)

Это сокращение от MySQL, оно эквивалентно стандарту ANSI:

 CASE WHEN (e.HomePage = 0 AND e.FeaturedProfile = 0) THEN 1
WHEN (e.HomePage IS NOT NULL AND e.FeaturedProfile IS NOT NULL) THEN 0
ELSE NULL
END

Ключевое слово ASC / DESC опускается после этого выражения, поэтому по умолчанию используется ASC (восходящая последовательность).

В итоге получается, что строки будут возвращены в следующем порядке:

Первый: строки, в которых логическое выражение возвращает 0 (ЛОЖЬ) (то есть любая строка, которая имеет ненулевые значения для обоих столбцов и ненулевое значение для одного (или обоих) столбцов.)

Далее следуют: строки, в которых логическое выражение возвращает 1 (ИСТИНА) (т. Е. Любая строка, которая имеет нулевые значения для обоих столбцов)

Далее следуют строки, где любой из столбцов равен NULL.


Вы правы в том, что есть и другие способы достижения эквивалентного результата. Например:

ORDER BY (e.HomePage AND e.FeaturedProfile), e.DateModified DESC

Первое выражение в предложении ORDER BY оценивается как логическое выражение. Это говорит о том же: если любой из столбцов равен NULL, результат равен NULL. Иначе, если любой из столбцов равен FALSE (имеет нулевое значение), результатом будет FALSE (0). В противном случае результат будет ИСТИНА (1). Результат этого выражения сортируется в порядке возрастания.

Если обработка значений NULL таким точным способом не важна, если мы действительно заинтересованы в получении строк, у которых HomePage или FeaturedProfile отличны от нуля:

ORDER BY (e.HomePage OR e.FeaturedProfile) DESC, e.DateModified DESC

Это немного отличается. Если, например, HomePage равен 1, а FeaturedProfile равен NULL, выражение будет иметь значение 1, и строка будет отсортирована первой. (В этом случае оригинал вернет NULL, и строка будет отсортирована последней.)

2

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

Это ваша order by пункт:

ORDER BY (HomePage = 0 AND FeaturedProfile = 0),
e.DateModified DESC

Он состоит из двух компонентов. Первое логическое выражение (HomePage = 0 AND FeaturedProfile = 0), который может принимать три значения: true, false и NULL, Помните, что MySQL рассматривает логические значения как целые числа с истинным значением 1 и ложным значением 0.

Так когда HomePage а также FeaturedProfile оба 0 (false), тогда выражение оценивается как TRUE. И это имеет значение 1. Если один или оба 1, тогда выражение оценивается как ЛОЖЬ со значением 0, Итак, они будут идти в порядке сортировки, потому что 0 меньше чем 1,

Я верю, как ваши данные настроены, это говорит о том, что у вас есть данные в одном из этих полей.

Второй компонент — это дата, поэтому в каждой группе дата сортируется по убыванию.

2

Когда вы делаете условный оператор, то есть логический результат true, false или null … Таким образом, результат true или false совпадает с целыми числами .. 0 для false и 1 для true .. Так что если вы, например, хотели знать числа, где столбец был равен определенному значению, которое вы могли бы сделать SUM(val = 1) и в любое время, когда выражение истинно, оно вернет 1, если оно ложно, вернет 0 и будет опущено из суммы. Конечным результатом будет сумма истинных условий, дающих счет. Когда вы выполняете ORDER BY, а затем условие, оно делает то же самое. Или упорядочиваете по 0 или 1 … поэтому, когда оно истинно, они будут сгруппированы в 1 категорию … Когда оно ложно, оно будет сгруппировано в 0 категория. Надеюсь, что это имеет смысл

Так с этим пониманием

ORDER BY (HomePage = 0 AND FeaturedProfile = 0), e.DateModified DESC

Это будет означать, что, когда домашняя страница и рекомендуемый профиль равны 0, тогда это будет упорядочено вторым, потому что это истинное утверждение. А затем, когда оно будет ложным, оно будет равно 0, поэтому он будет упорядочен первым в порядке ASC по умолчанию … дата будет упорядочена в порядке убывания

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