Помогите понять этот запрос MySQL с помощью ORDER BY и CASE

#mysql #sql

#mysql #sql

Вопрос:

Я пытаюсь понять этот запрос MySQL. Предположительно, он выполняет поиск в таблице «элементы» по ключевому слову поиска «brown fox lazy dog» и возвращает результат на основе его релевантности или количества раз, когда он встречается в записях.

 SELECT *
FROM `items`
WHERE `description` LIKE 'quick'
AND (
  `description` LIKE 'brown'
  OR `description` LIKE 'fox'
  OR `description` LIKE 'lazy'
  OR `description` LIKE 'dog'
)
ORDER BY (
  (
    CASE WHEN `description` LIKE 'brown'
    THEN 1
    ELSE 0
    END
  )   (
    CASE WHEN `description` LIKE 'fox'
    THEN 1
    ELSE 0
    END
  )   (
    CASE WHEN `description` LIKE 'lazy'
    THEN 1
    ELSE 0
    END
  )   (
    CASE WHEN `description` LIKE 'dog'
    THEN 1
    ELSE 0
    END
  )
) DESC
LIMIT 0, 30
  

Часть, которую я не понимаю, находится в части в предложениях ORDER BY и CASE. Скажем, конкретная запись соответствует всем 4 ключевым словам, по которым выполняется поиск, мы получаем ORDER BY (4)? Как это 4 связано с рассматриваемой частной строкой? Насколько я понимаю, ORDER BY обычно используется в столбце, а не в числе? Спасибо!

Комментарии:

1. Похоже, вам не хватает подстановочных знаков, и на данный момент он не может вернуть результатов. (должно быть LIKE '%dog%' и т.д.)

Ответ №1:

ORDER BY может использоваться для любого значения, полученного из полей в каждой строке. В этом случае мы упорядочиваем по количеству важных слов, появляющихся в description поле. Итак, как вы сказали, если конкретная запись соответствует всем 4 ключевым словам, то она получает 4 и заканчивается в верхней части (по убыванию) упорядочения. Если запись соответствует только одному из ключевых слов, она получает 1 и заканчивается ближе к концу. Вы даже можете сказать ORDER BY RAND() , который выполняет именно то, что вы ожидаете. ПОРЯДОК По RAND() ПРЕДЕЛ 1 — очень распространенная идиома для случайного выбора одной строки из таблицы. Однако не используйте ORDER BY RAND() LIMIT 1 для больших таблиц, потому что он все равно генерирует случайное число для каждой строки (очень дорогое), просто чтобы выяснить, какое из них наименьшее.

Ответ №2:

число здесь относится к столбцу, который будет использоваться для упорядочивания результатов, первый столбец будет равен 1.
не смог найти ссылку на это в Интернете, но я обнаружил это случайно, и это иногда бывает полезно.

Комментарии:

1. Нет, в данном случае это неприменимо. ORDER BY <literal number> выдает поведение, которое вы описываете — то есть сортировку по столбцу, определяемому порядковой позицией, — но это ORDER BY <computed value expression> .

2. интересно, в любом случае не удалось найти ни один из них в онлайн-ссылке mysql.

Ответ №3:

Этот запрос используется для упорядочивания по элементам, скажем, по «релевантности» …

Порядок по частям будет таким, например, если описание похоже на ‘%dog%’, порядок по будет равен 1, и если то же описание содержит ‘lazy’, порядок по будет равен 1 1; это означает, что в текущей строке было два ключевых слова ‘dog’ и ‘lazy’. и так далее.

Этот запрос упорядочивает элементы по «описанию, которое содержит ключевое слово max of», поэтому, если запись строки соответствует всем 4 ключевым словам, тогда она получает 4 и заканчивается в верхней части (по убыванию) упорядочения. Если запись строки соответствует только одному из ключевых слов, она получает 1 и заканчивается в самом низу.