SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 18.04.2021 18:37:34

Schupp
Участник
Зарегистрирован: 18.04.2021
Сообщений: 4

Сортировка по вычисляемой сумме значений полей

Здравствуйте всем уважаемым специалистам,
обращаюсь за помощью (не пинайте, практически ноль в SQL, чисто основы знаю, не более).

Есть запрос:


"SELECT u.username, SUM(
                              IF(up.first_player_score = g.first_player_score AND up.second_player_score=g.second_player_score,3,0)+
                              IF(up.first_player_score = g.first_player_score OR up.second_player_score=g.second_player_score,1,0)) as point_res,
        (
                SELECT SUM(IF(ucq1.answer = cq1.right_answer,5,0))
                FROM `user_castom_question` ucq1
                LEFT JOIN castom_question cq1 ON cq1.id=ucq1.`castom_req_id`
                WHERE ucq1.user_id = u.user_id AND cq1.tounament_id=g.tournament_id
         ) as points_castom_req
        FROM user_prediction up
        LEFT JOIN game g ON g.id=up.game_id
        LEFT JOIN "
. USERS_TABLE ." as u  ON up.user_id=u.user_id
        WHERE g.tournament_id=$tournmanent_id
        GROUP BY u.user_id ORDER BY point_res DESC
        "
;

 


Возможно ли сделать сортировку не по point_res, а по point_res+points_castom_req? Методом научного тыка пробовал кучу вариантов, но не преуспел... Подскажите пожалуйста, если возможно, как это реализовать?
Заранее очень и очень благодарен

Неактивен

 

#2 18.04.2021 19:39:05

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2419

Re: Сортировка по вычисляемой сумме значений полей

Вместо
ORDER BY point_res
попробуйте
ORDER BY point_res, points_castom_req

Если не получится, то приведите структуру таблиц, тестовое наполнение данных, требуемый результат в виде таблицы.
Желательно на sqlfiddle.com, см.

http://sqlfiddle.com/#!9/faf2f/1


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#3 18.04.2021 19:59:19

Schupp
Участник
Зарегистрирован: 18.04.2021
Сообщений: 4

Re: Сортировка по вычисляемой сумме значений полей

deadka написал:

Вместо
ORDER BY point_res
попробуйте
ORDER BY point_res, points_castom_req

Если не получится, то приведите структуру таблиц, тестовое наполнение данных, требуемый результат в виде таблицы.
Желательно на sqlfiddle.com, см.

http://sqlfiddle.com/#!9/faf2f/1

Ваш вариант - это сортировка по двум значениям, а мне надо по сумме значений.

Дело в том, что оба этих значения - point_res и points_castom_req - вычисляемые (что происходит в самом запросе, в самом начале видно).

SUM(
      IF(up.first_player_score = g.first_player_score AND up.second_player_score=g.second_player_score,3,0)+
                              IF(up.first_player_score = g.first_player_score OR up.second_player_score=g.second_player_score,1,0)) as point_res,


Это одно значение.

(
                SELECT SUM(IF(ucq1.answer = cq1.right_answer,5,0))
                FROM `user_castom_question` ucq1
                LEFT JOIN castom_question cq1 ON cq1.id=ucq1.`castom_req_id`
                WHERE ucq1.user_id = u.user_id AND cq1.tounament_id=g.tournament_id
         ) as points_castom_req
 

Это второе. То есть в запросе уже есть две этих "переменных", их значение вычислено. Я сортирую по point_res (если по сути - это вычисление набранных очков пользователем без очков за дополнительные вопросы).

points_castom_req - в этой переменной вычислены очки за ответы на дополнительные вопросы. При выводе таблицы общей (на php) я не разобрался, как в массиве сортировать.

А здесь мне нужно получить аналог ORDER BY (point_res+points_castom_req) DESC (я понимаю что семантически эта конструкция неверна, я имею ввиду смысл). То есть если у одного пользователя 10 очков набрано и 5 дополнительных (в сумме 15), а у другого 11 очков и 0 дополнительных (в сумме 11), то сейчас у меня выводится первым тот, у кого 11. А хотелось бы вывести того, у кого общая сумма больше, то есть 15 очков.

Неактивен

 

#4 18.04.2021 20:29:50

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2419

Re: Сортировка по вычисляемой сумме значений полей

А почему
ORDER BY (point_res+points_castom_req) DESC
неверно? Так можно делать.

И - просьба разместить пример на sqlfiddle была не для красного словца wink


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#5 18.04.2021 21:06:03

Schupp
Участник
Зарегистрирован: 18.04.2021
Сообщений: 4

Re: Сортировка по вычисляемой сумме значений полей

deadka написал:

А почему
ORDER BY (point_res+points_castom_req) DESC
неверно? Так можно делать.

SQL ERROR [ mysqli ]

Reference 'point_res' not supported (reference to group function) [1247]

SQL

SELECT u.username, SUM( IF(up.first_player_score = g.first_player_score AND up.second_player_score=g.second_player_score,3,0)+ IF(up.first_player_score = g.first_player_score OR up.second_player_score=g.second_player_score,1,0)) as point_res, ( SELECT SUM(IF(ucq1.answer = cq1.right_answer,5,0)) FROM `user_castom_question` ucq1 LEFT JOIN castom_question cq1 ON cq1.id=ucq1.`castom_req_id` WHERE ucq1.user_id = u.user_id AND cq1.tounament_id=g.tournament_id ) as points_castom_req FROM user_prediction up LEFT JOIN game g ON g.id=up.game_id LEFT JOIN phpbb6c_users as u ON up.user_id=u.user_id WHERE g.tournament_id=1 GROUP BY u.user_id ORDER BY (point_res+points_castom_req) DESC



Увы... ORDER BY (point_res+points_castom_req) DESC дает ошибку. А ORDER BY point_res DESC прекрасно работает.

deadka написал:

И - просьба разместить пример на sqlfiddle была не для красного словца wink

Если бы я что-то там понимал sad Я честно стараюсь разобраться, но... Пока не получается.

Неактивен

 

#6 18.04.2021 21:37:47

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2419

Re: Сортировка по вычисляемой сумме значений полей

По поводу Вашей ошибки

https://stackoverflow.com/questions/177 … up-functio

подставьте в order by не point_res, а само значение, которое Вы обозвали point_res'ом, то есть

SUM( IF(up.first_player_score = g.first_player_score AND up.second_player_score=g.second_player_score,3,0)+ IF(up.first_player_score = g.first_player_score OR up.second_player_score=g.second_player_score,1,0))

и вместо второго значения points_castom_req

( SELECT SUM(IF(ucq1.answer = cq1.right_answer,5,0)) FROM `user_castom_question` ucq1 LEFT JOIN castom_question cq1 ON cq1.id=ucq1.`castom_req_id` WHERE ucq1.user_id = u.user_id AND cq1.tounament_id=g.tournament_id )

- тогда, думаю, сработает.

Опять же вопрос - в чем такая необходимость сортировать это именно средствами sql-запроса?
Почему бы не сделать это на клиенте?

По sqlfiddle - нужна структура ваших таблиц и данные.
Если на можете на sqlfiddle, то хотя бы вот так как тут
https://sqlinfo.ru/forum/viewtopic.php?pid=40086#p40086
то есть show create table t;
и сами данные


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#7 18.04.2021 22:32:23

Schupp
Участник
Зарегистрирован: 18.04.2021
Сообщений: 4

Re: Сортировка по вычисляемой сумме значений полей

deadka

Низкий поклон!!! Сработало:

ORDER BY SUM( IF(up.first_player_score = g.first_player_score AND up.second_player_score=g.second_player_score,3,0)+ IF(up.first_player_score = g.first_player_score OR up.second_player_score=g.second_player_score,1,0))+ points_castom_req DESC

       

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

Неактивен

 

#8 18.04.2021 22:40:11

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2419

Re: Сортировка по вычисляемой сумме значений полей

Отлично, но повторяю свою рекомендацию сортировать данные на клиенте, а не средствами запроса.
Ибо такая конструкция ОЧЕНЬ неоптимальная.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson