Странная проблема в том, что она работает, но я не понимаю, почему. Я надеюсь узнать, почему это работает.
Я искал в сети и stackOverflow ответ, но не могу найти один
(Я вышел с этим кодом методом проб и ошибок …)
Я пытался заказать по 3 колонки.
Я хотел, чтобы результаты из первых двух столбцов были смешаны вместе, но сначала, а затем все результаты, упорядоченные по третьему столбцу (дата)
Это основная структура таблицы базы данных:
ПРИМЕЧАНИЕ. 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
Надеюсь, что этот вопрос разрешен, так как он беспокоит меня, почему это работает, и я хотел бы узнать это для дальнейшего использования ….
Заранее спасибо, и я буду рад отметить любого, кто может помочь мне понять это!
Первое выражение в вашем предложении 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, и строка будет отсортирована последней.)
Это ваша 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
,
Я верю, как ваши данные настроены, это говорит о том, что у вас есть данные в одном из этих полей.
Второй компонент — это дата, поэтому в каждой группе дата сортируется по убыванию.
Когда вы делаете условный оператор, то есть логический результат 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 по умолчанию … дата будет упорядочена в порядке убывания