Правила     Закладки     Карма    Календарь    Журналы    Помощь    Поиск    PDA    Чат   
        СМС-ки
   
Пейджер выключен!
 
Фильтр авторов:    показать 
  скрыть
  Ответ в темуСоздание новой темыСоздание опроса

> order by and group by
savelikan  
 ۩  [x] Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 420
Пользователь №: 18633
На форуме: 7 лет, 10 месяцев, 15 дней
Карма:




Привет всем, подскажите, пожалуйста решение задачи)
Есть таблица результатов тестов, нужно для кажного юзера отобразить найлучший результат
как я только не менял запрос - всё равно при групировке order by `ptsst_percent` desc слетает.

select * from (
select *
from `pts_stest`
left join `users` on `users`.`u_id` = `pts_stest`.`ptsst_user`
order by `ptsst_percent` desc
) as `res`
where `ptsst_topic` = ".$TSTtopic['ptst_id']." and `ptsst_status` = 1
group by `res`.`ptsst_user`


ну и небольшой пример дампа
дамп внутри, чтобы лучше читать сообщение
CREATE TABLE `pts_stest` (
`ptsst_id` int(11) NOT NULL,
`ptsst_topic` int(11) NOT NULL,
`ptsst_user` int(11) NOT NULL,
`ptsst_start` int(11) NOT NULL,
`ptsst_finish` int(11) NOT NULL,
`ptsst_result` longtext NOT NULL,
`ptsst_status` tinyint(1) NOT NULL DEFAULT '0',
`ptsst_all` int(11) NOT NULL DEFAULT '0',
`ptsst_true` int(11) NOT NULL DEFAULT '0',
`ptsst_false` int(11) NOT NULL DEFAULT '0',
`ptsst_percent` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;



INSERT INTO `pts_stest` (`ptsst_id`, `ptsst_topic`, `ptsst_user`, `ptsst_start`, `ptsst_finish`, `ptsst_result`, `ptsst_status`, `ptsst_all`, `ptsst_true`, `ptsst_false`, `ptsst_percent`) VALUES
(1, 1, 5, 1489829437, 1489829440, 'a:1:{i:1;a:5:{s:2:\"id\";i:1;s:7:\"cnttrue\";i:1;s:4:\"answ\";a:4:{i:0;i:1;i:1;i:0;i:2;i:2;i:3;i:3;}s:2:\"tp\";i:1;s:2:\"my\";a:1:{i:0;i:1;}}}', 1, 1, 1, 0, 0),
(21, 1, 1, 1490035878, 1490035884, 'a:2:{i:1;a:5:{s:2:\"id\";i:138;s:7:\"cnttrue\";i:1;s:4:\"answ\";a:5:{i:0;i:2;i:1;i:1;i:2;i:0;i:3;i:4;i:4;i:3;}s:2:\"tp\";i:1;s:2:\"my\";a:1:{i:0;i:2;}}i:2;a:5:{s:2:\"id\";i:145;s:7:\"cnttrue\";i:1;s:4:\"answ\";a:5:{i:0;i:0;i:1;i:3;i:2;i:4;i:3;i:2;i:4;i:1;}s:2:\"tp\";i:1;s:2:\"my\";a:1:{i:0;i:4;}}}', 1, 2, 0, 2, 0),
(22, 1, 1, 1490035919, 1490035921, 'a:2:{i:1;a:5:{s:2:\"id\";i:44;s:7:\"cnttrue\";i:1;s:4:\"answ\";a:5:{i:0;i:3;i:1;i:4;i:2;i:2;i:3;i:1;i:4;i:0;}s:2:\"tp\";i:1;s:2:\"my\";N;}i:2;a:5:{s:2:\"id\";i:82;s:7:\"cnttrue\";i:1;s:4:\"answ\";a:5:{i:0;i:2;i:1;i:4;i:2;i:0;i:3;i:1;i:4;i:3;}s:2:\"tp\";i:1;s:2:\"my\";N;}}', 1, 2, 0, 0, 10),
(23, 1, 1, 1490035927, 1490035929, 'a:2:{i:1;a:5:{s:2:\"id\";i:153;s:7:\"cnttrue\";i:1;s:4:\"answ\";a:5:{i:0;i:4;i:1;i:2;i:2;i:1;i:3;i:3;i:4;i:0;}s:2:\"tp\";i:1;s:2:\"my\";N;}i:2;a:5:{s:2:\"id\";i:163;s:7:\"cnttrue\";i:1;s:4:\"answ\";a:5:{i:0;i:0;i:1;i:3;i:2;i:1;i:3;i:4;i:4;i:2;}s:2:\"tp\";i:1;s:2:\"my\";a:1:{i:0;i:3;}}}', 1, 2, 0, 1, 20);


Это сообщение отредактировал sergeiss - 21.03.2017 - 11:27


--------------------
Одесса - мой город!)))
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
depp  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 388
Пользователь №: 40589
На форуме: 2 года, 6 месяцев, 20 дней
Карма: 22




select * from (
select *
from `pts_stest`
left join `users` on `users`.`u_id` = `pts_stest`.`ptsst_user`

) as `res`
where `ptsst_topic` = ".$TSTtopic['ptst_id']." and `ptsst_status` = 1
group by `res`.`ptsst_user`
order by `ptsst_percent` desc

долго не вчитывался. просто перетащил ордер туда, где он должен быть в данной ситуации.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
savelikan  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 420
Пользователь №: 18633
На форуме: 7 лет, 10 месяцев, 15 дней
Карма:




Цитата (depp @ 20.03.2017 - 21:18)
долго не вчитывался. просто перетащил ордер туда, где он должен быть в данной ситуации.

тогда результаты отсортируются уже после группировки
А нужно значала выбрать все записи, отсортировать для кажного пользователя от лучшего результата теста до худшего, потом через группировку оставить только лучший результат для кажного пользователя


--------------------
Одесса - мой город!)))
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
walerus  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Чтобы все !
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 2330
Пользователь №: 26852
На форуме: 6 лет, 3 месяца, 8 дней
Карма: 127




savelikan
left join `users` on `users`.`u_id` = `pts_stest`.`ptsst_user`
а где дамп базы пользователей?
where `ptsst_topic` = ".$TSTtopic['ptst_id']." and `ptsst_status` = 1
а чему равна переменная ??

И я не понял какое "имя" ячейки определяет лучшее значение? - наивысшее значение процентов? или "ptsst_result", если да то там вообще сериализированные данные... напиши толком что нужно то?

хоть бы ячейки подписал, что к чему относится... :blink:
PMПисьмо на e-mail пользователюICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
savelikan  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 420
Пользователь №: 18633
На форуме: 7 лет, 10 месяцев, 15 дней
Карма:




Лучшее значение в поле `ptsst_percent`
Переменная ".$TSTtopic['ptst_id']." равна 1
Простая база юзеров, `users`.`u_id` - ид юзера, в базе результатов он равен `pts_stest`.`ptsst_user`


--------------------
Одесса - мой город!)))
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
sergeiss  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Сидел он, дум великих полон - и вдаль глядел
******

Профиль
Группа: Эксперт
Группа переписки
Сообщений: 15381
Пользователь №: 4190
На форуме: 9 лет, 4 месяца, 18 дней
Карма: 470




Цитата (savelikan @ 20.03.2017 - 23:04)
Есть таблица результатов тестов, нужно для кажного юзера отобразить найлучший результат
как я только не менял запрос - всё равно при групировке order by `ptsst_percent` desc слетает.

Цитата (savelikan @ 20.03.2017 - 23:24)
А нужно значала выбрать все записи, отсортировать для кажного пользователя от лучшего результата теста до худшего, потом через группировку оставить только лучший результат для кажного пользователя

Ну так сделай по-другому тогда. Примерно так (имена полей и таблиц не твои, а абстрактные)
select 
id_user,
user_name
(
select result
from second_table
where second_table.id_user = main_table.id_user
order by percent desc
limit
1
) as best_result
from main_table
where <условие на нужных юзеров>

То есть, выбираем всех нужных юзеров и для каждого из них выбираем один - лучший - результат из второй таблицы. Всё ясно, понятно, прозрачно.
Можно поменять условие во вложенном запросе и получить другой результат :) Ну, например, мы хотим получить наихудший результат. Достаточно убрать desc в order by.

PS. Уже отправил ответ и понял, что у тебя одна таблица. Нет проблем :) Переписываем запрос, чтобы обращаться к одной и той же таблице с разными алиасами

select 
id_user,
user_name
(
select result
from your_table
where your_table.id_user = main_table.id_user
order by percent desc
limit
1
) as best_result
from
(
select id_user, user_name
from your_table
where <условие на нужных юзеров>) main_table


Это сообщение отредактировал sergeiss - 21.03.2017 - 11:50


--------------------
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
PMICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
savelikan  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 420
Пользователь №: 18633
На форуме: 7 лет, 10 месяцев, 15 дней
Карма:




Тогда мне нужно получить все поля с таблицы "second_table"


--------------------
Одесса - мой город!)))
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
twin  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Глухой нуб
******

Профиль
Группа: Администратор
Почтальон группы
Сообщений: 16113
Пользователь №: 6543
На форуме: 8 лет, 8 месяцев, 21 день
Карма: 303

Трезвый :
6 лет, 5 месяцев, 30 дней


savelikan
Дамп второй таблицы в студию. Иначе лениво. smile.gif


--------------------
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
PMСайт пользователяICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
sergeiss  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Сидел он, дум великих полон - и вдаль глядел
******

Профиль
Группа: Эксперт
Группа переписки
Сообщений: 15381
Пользователь №: 4190
На форуме: 9 лет, 4 месяца, 18 дней
Карма: 470




savelikan, давай для начала все-таки определимся, сколько у тебя таблиц, какие там данные и что надо получить.
Я уже запутался - у тебя одна или две таблицы? И что именно ты хочешь получить.
Также покажи структуру таблиц.


--------------------
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
PMICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
killer8080  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Эксперт
Группа переписки
Сообщений: 8946
Пользователь №: 26630
На форуме: 6 лет, 3 месяца, 22 дня
Карма: 605




SET sql_mode='';
SELECT *, MAX(p.ptsst_percent) best
FROM pts_stest p
LEFT JOIN users u ON u.u_id = p.ptsst_user
GROUP BY p.ptsst_user
ORDER BY best DESC;
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
  Быстрый ответ
Информация о Госте
Введите Ваше имя
Кнопки кодов
Для вставки цитаты, выделите нужный текст и
НАЖМИТЕ СЮДА
Введите сообщение
Смайлики
:huh:  :o  ;) 
:P  :D  :lol: 
B)  :rolleyes:  <_< 
:)  :angry:  :( 
:unsure:  :blink:  :ph34r: 
     
Показать всё

Опции сообщения  Включить смайлики?
 Включить подпись?
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:

Опции темы Ответ в темуСоздание новой темыСоздание опроса