2012-01-11 3 views
1

У меня есть таблица, которая хранит значения каждый час с веб-сайта на основе 100 пользователей. Каждый пользователь присутствует каждый час, но может иметь более высокое/меньшее значение.Найти наибольшую разницу между двумя строками

Я хочу найти наивысшую разницу между строками и вывести их.

mysql_query("SELECT `username`,`energy` FROM `hoflevel`"); 

Я знаю, что я мог бы перебирать все строки каждого пользователя и находить наивысшее значение, но это слишком много кода. Я уверен, что есть способ выяснить самую большую разницу между двумя строками, сгруппированными по имени пользователя. Это не должно быть только каждый час. Это было бы как «Алан установил рекорд 345 048 энергии в 5 утра вчера!».

+0

Значит, это определенно разница, которую вы хотите? Сортировка 'SELECT username, max (energy1-energy2) FROM hoflevel GROUP BY username', где' energy1' и 'energy2' - все пары« энергии »для этого' username'? А что, если данный пользователь имеет только одно значение «энергии» в базе данных? –

+0

Справа. Энергия1 - энергия2. Забудьте о единственной ценности. :П – AlanPHP

ответ

3

Это получает максимальную разницу в energy для каждого пользователя, не обращая внимания пользователей только с одной записью:

SELECT hoflevel.username, MAX(hoflevel.energy-h.energy) as maxDiff 
FROM hoflevel 
LEFT JOIN hoflevel h 
ON h.username=hoflevel.username AND hoflevel.energy>=h.energy 
WHERE h.energy IS NOT NULL 
GROUP BY hoflevel.username; 

В основном, он присоединяется hoflevel к себе на username, которая создает таблицу с username и каждую пару energy значений для этого пользователя.

Затем он выдает максимальную разницу между энергиями, сгруппированными по username.

Обратите внимание, вы можете дополнительно сэкономить вычисления, игнорируя пользователей, которые могут иметь несколько записей в базе данных, но один и тот же energy каждый раз (и поэтому их maxDiff 0) путем изменения >= к > в состоянии присоединиться.

Смежные вопросы