MySql сортировать по результату от функции

0

Допустим, у меня есть таблица SQL, и я хочу отсортировать ее по результатам расчета.

 ID   user_id   field_id  value
 10      1         11      name 1
 11      1         12      13.22333    // A
 12      1         13      45.3322     // B
 13      2         11      name 2
 14      2         12      120.99      // A
 15      2         13      99.343      // B

У меня есть функция sql, подобная этой

   calc(float A,float B) {
     return A*B;
   }

Я должен сортировать пользователей на основе возвращаемого значения из calc, где:

  A=value when field_id=12
  B=value when field_id=13

  select * from table order by calc(A,B)

Кто-нибудь знает правильный синтаксис MYSQL?

Вывод представляет собой список user_id, который сортируется с использованием функции calc

  • 1
    Можете ли вы поделиться ожидаемым результатом?
  • 0
    Вывод представляет собой список user_id, который отсортирован с помощью функции calc
Теги:

2 ответа

0
Лучший ответ

Сделайте самостоятельное соединение:

 SELECT A.user_id, calc(A.value, B.value)
 FROM table as A
 JOIN table as B
   ON A.user_id = B.user_id
 WHERE A.field_id  = 12
   AND B.field_id  = 13
 ORDER BY calc(A.value, B.value)

Использование одного вызова:

 SELECT *
 FROM (
     SELECT A.user_id, calc(A.value, B.value) as Total
     FROM table as A
     JOIN table as B
       ON A.user_id = B.user_id
     WHERE A.field_id  = 12
       AND B.field_id  = 13
) as T
ORDER BY Total
  • 0
    Спасибо попробую .....
  • 0
    Кажется, работает, спасибо, но вы знаете, если Calc вызывается дважды? Фактическая функция calc выполняет много сложных вычислений, которые могут занять много времени, есть ли способ вызвать ее только один раз для оператора SQL?
Показать ещё 8 комментариев
0

Вы можете добиться того же, не используя function.

Решение 1

 SELECT A.user_id, A.value * B.value as calculatedVal
 FROM table as A
 JOIN table as B
   ON A.user_id = B.user_id
 WHERE A.field_id  = 12
   AND B.field_id  = 13
 ORDER BY (A.value * B.value)

Решение 2

 SELECT A.user_id, A.value * B.value as calculatedVal
 FROM table as A
 JOIN table as B
   ON A.user_id = B.user_id
 WHERE A.field_id  = 12
   AND B.field_id  = 13
 ORDER BY calculatedVal
  • 0
    Спасибо, хороший ответ, но реальная функция calc очень сложна, поэтому сделать ее встроенной непросто.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню