Nano Hash - криптовалюты, майнинг, программирование

Mysql ORDER BY или MAX() для заказа нескольких полей таблицы?

Я перепутал со странным поведением запроса MySQL. У меня есть следующий запрос mysql:

SELECT 'username','status', 'field_1', 'field_2', 'field_3', 'field_4',  
    FROM my_table 
    ORDER by field_1 DESC, field_2 DESC, field_3 DESC, field_4 DESC 
    LIMIT 0,10 

По идее, он должен упорядочить 10 строк по убыванию в зависимости от того, сколько значений поля имеют в условии ORDER BY. Но в результате я получаю следующее:

Кейт 103
Пит 101
Стив 102

вместо

Кейт 103
Стив 102
Пит 101

Кто-нибудь знает, почему он установил неправильный порядок? И что делать, чтобы сделать правильное условие ORDER BY DESC?

Можно ли использовать MAX() для нескольких полей? Если да, возможно, можно организовать запрос MySQL следующим образом?

SELECT 'username','status', 'field_1', 'field_2', 'field_3', 'field_4', MAX(field_1,field_2,field_3,field_4) AS total 
    FROM my_table 
    ORDER by total DESC 
    LIMIT 0,10

  • Ваш вопрос не имеет смысла. Вы не можете упорядочивать по field_1, field_2, field_3 и field_4, когда у вас есть только два столбца (ни один из которых не содержит слова «поле», BTW) в вашем выборе. Если вам нужна помощь с вашим запросом, опубликуйте более реалистичный SQL, демонстрирующий вашу проблему. 07.06.2011
  • @KenWhite извините! забыл упомянуть, что у меня есть порядок по полям в выборе. торопился, поэтому забыл указать их и в полях SELECT. 08.06.2011

Ответы:


1

Вы не можете использовать MAX(), поскольку эта функция возвращает наибольшее значение в одном столбце из множества строк. Но вы можете использовать функцию MySQL GREATEST(). Это возвращает самый большой из его аргументов, которые все поступают из одной строки.

SELECT `username`, `status`, GREATEST(field_1,field_2,field_3,field_4) AS field_greatest
FROM my_table
ORDER BY field_greatest DESC
LIMIT 0,10

Но я бы также прокомментировал, что вы нарушили 1-ю нормальную форму, сохранив несколько столбцов, которые должны быть одинаковыми. «вид» данных. Это называется повторяющиеся группы. Последствия заключаются в том, что вы сталкиваетесь с этим неприятным запросом. Также вам нужно будет переписать все ваши запросы, когда вы добавите пятое поле.

Вместо этого создайте вторую таблицу и сохраните все «поля» в одном столбце со ссылкой на пользователя. Затем вы можете присоединиться к столам:

SELECT t.username, t.status, f.field
FROM my_table AS t
LEFT OUTER JOIN (SELECT username, MAX(field) AS field FROM my_fields GROUP BY username) AS f
  ON t.username = f.username
ORDER BY f.field DESC
LIMIT 0,10

Или мой любимый способ получить строку с наибольшим значением для группы:

SELECT t.username, t.status, f1.field
FROM my_table AS t
JOIN my_fields AS f1 ON t.username = f1.username
LEFT OUTER JOIN my_fields AS f2 ON t.username = f2.username AND f1.field < f2.field
WHERE f2.username IS NULL
ORDER BY f1.field DESC
LIMIT 0,10
07.06.2011
  • Спасибо за помощь! функция GREATEST() действительно подходит к ситуации и работает быстро. Это то, что мне было нужно. знак равно 11.06.2011

  • 2

    Вы не можете передать несколько значений в max. Однако вы можете сделать несколько вложенных IF().

    SELECT `username`,`status`,  
    MAX(
      if( field_1 > field_2 and field_1 > field_3 and field_1 > field_4 ,field_1, 
      if( field_2 > field_3 and field_2 > field_4 ,field_2,
      if( field_3 > field_4, field_3, field_4 )))) AS total 
    FROM my_table 
    ORDER by total DESC 
    LIMIT 0,10
    
    07.06.2011
  • почему условие ORDER BY не работает в этой ситуации? ваш пример будет работать быстро или медленно? У меня около 5000 строк в таблице. Если использовать ваш пример с MAX(), будет ли это дополнительной нагрузкой на сервер MySQL? благодарю вас 08.06.2011
  • @ilnur777 ilnur777, у вас есть база данных, так что протестируйте и посмотрите, насколько быстро/медленно она работает. Я предполагаю, что он будет работать медленно со всеми этими тестами. 08.06.2011
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..