За последние 24 часа нас посетили 59154 программиста и 1814 роботов. Сейчас ищут 966 программистов ...

Выборка из БД, вывод максимального значения при группировке

Тема в разделе "PHP и базы данных", создана пользователем SiUna, 2 май 2012.

  1. SiUna

    SiUna Активный пользователь

    С нами с:
    1 апр 2012
    Сообщения:
    41
    Симпатии:
    0
    Подскажите пожалуйста как сделать чтобы в запросе выводился список людей, каждый должен выводится только 1 раз со своим максимальным результатом:
    Код (Text):
    1.  
    2. $query = mysql_query("SELECT
    3. `jos_comprofiler`.`user_id`,
    4. `jos_comprofiler`.`firstname`,
    5. `jos_comprofiler`.`middlename`,
    6. `jos_comprofiler`.`lastname`,
    7. `jos_comprofiler`.`cb_group`,
    8. `resulttest`.`result`,
    9. `resulttest`.`lastvisit`,
    10. `resulttest`.`user_id`
    11. FROM
    12.  `jos_comprofiler`
    13. JOIN
    14. `resulttest`
    15. ON
    16. `resulttest`.`user_id`=`jos_comprofiler`.`user_id`
    17. WHERE
    18. `jos_comprofiler`.`cb_group` = '$group1'
    19. GROUP BY `resulttest`.`user_id`
    20. ORDER BY `lastname` asc, `result` desc") or die (mysql_error());
    Так все выводит, но он берет id которое встречается первое, а остальные пропускает, а у первого не всегда максимальный результат.
    На сколько я знаю в WHERE нельзя использовать агрегатные функции, как MAX(`result`), по крайней мере у меня не получилось
    Может как то сделать сначала запрос выбрать упорядочив по имени, результату, а потом уже тот запрос сгруппировать. Но как можно сгруппировать результат первого запроса?
     
  2. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Re: Выборка из БД, вывод максимального значения при группиро

    :D, причем тут вообще WHERE и MAX вы читали вообще, что это?
    Может быть Вам HAVING нужен?

    Вообще то:
    "SELECT MAX(id) WHERE ............"
    $m['MAX(id)']

    "SELECT MAX(id) as max_id WHERE ............"
    $m['max_id']
     
  3. Chushkin

    Chushkin Активный пользователь

    С нами с:
    17 дек 2010
    Сообщения:
    1.062
    Симпатии:
    91
    Адрес:
    Мещёра, Центр, Болото N3
    Re: Выборка из БД, вывод максимального значения при группиро

    Your прав - для такого запроса Вам необходимо написать примерно так:
    Код (Text):
    1. ...
    2. GROUP BY jos_comprofiler.user_id
    3. HAVING resulttest.result = max(resulttest.result)
    п.с. стоит учесть, что подобные запросы крайне неэффективные
     
  4. SiUna

    SiUna Активный пользователь

    С нами с:
    1 апр 2012
    Сообщения:
    41
    Симпатии:
    0
    Re: Выборка из БД, вывод максимального значения при группиро

    Я пробовала так писать, но тогда запрос просто не выводит данные. Поскольку он сначала группирует всех встреченных первых по id, и только потом из них выбирает, если выбранный id был с max значением то выводит, если не с max значением то не выводит.
    А мне нужно чтобы выводил каждого пользователя с его максимальным значением результата.

    Добавлено спустя 1 минуту 36 секунд:
    Re: Выборка из БД, вывод максимального значения при группировке
    Когда я пробовала так делать поля с результатом выводит мне пустые, как будто там ничего нет, незнаю почему)
     
  5. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Re: Выборка из БД, вывод максимального значения при группиро

    Мне лень разбирать это... =)
     
  6. SiUna

    SiUna Активный пользователь

    С нами с:
    1 апр 2012
    Сообщения:
    41
    Симпатии:
    0
    Re: Выборка из БД, вывод максимального значения при группиро

    Да там и ненужно, подскажите как один запрос в другой вставить?
    Сначала просто сделать упорядочивание по результатам, чтобы вверху были максимальные, а затем в этом упорядоченном просто сделать GROUP BY, тогда он выберет те id что первые встретит и они будут с максимальным результатом. Я просто незнаю как сделать группировку по уже сделанному запросу
     
  7. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    Re: Выборка из БД, вывод максимального значения при группиро

    когда делаете GROUP BY, во фразе SELECT можно ставить ту колонку(и) по которой делаете группировку + агрегатные функции от других колонок
    например
    Код (Text):
    1.  
    2. SELECT user_id, max(lastvisit)
    3. FROM jos_comprofiler
    4. GROUP BY user_id
    это правильное выражение,

    а такое
    Код (Text):
    1.  
    2. SELECT user_id, lastvisit
    3. FROM jos_comprofiler
    4. GROUP BY user_id
    НЕправильное: MySql допускает такой синтаксис (oracle выдал бы ошибку), но результат неопределен. фиг знает что в этом случае должен значить lastvisit

    суть понятна?

    когда добавляете JOIN ничего не меняется — все также можно только группируемые колонки и агрегаты от других

    Добавлено спустя 8 минут 36 секунд:
    Re: Выборка из БД, вывод максимального значения при группировке
    понятно ваше желание засунуть туда firstname, lastname и т.п. говно. нельзя так делать. получите чистые user_id и расчетные цифры max() или sum()...
    уже результат этой правильной выборки вы можете "заджойнить" опять с таблицей jos_comprofiler по user_id чтобы получить имена. сначала селект-с-группировкой в подзапросе, затем джойн
     
  8. SiUna

    SiUna Активный пользователь

    С нами с:
    1 апр 2012
    Сообщения:
    41
    Симпатии:
    0
    Re: Выборка из БД, вывод максимального значения при группиро

    Хорошо, но как же тогда остальные столбцы которые мне надо выбрать из таблиц?
    Ну и я поняла что у mysql в таком случае значит вторая колонка) Просто то что было встреченно с первым id которое он и выбрал, а остальные он просто пропустил в процессе выборки.
     
  9. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    Re: Выборка из БД, вывод максимального значения при группиро

    я ответил
     
  10. SiUna

    SiUna Активный пользователь

    С нами с:
    1 апр 2012
    Сообщения:
    41
    Симпатии:
    0
    Re: Выборка из БД, вывод максимального значения при группиро

    просто пока писала, не обновляла. Спасибо, теперь понятно как эти запросы объединить. Просто я думала Join объединяет имеющиеся таблицы, а не запросы. Можно использовать select... join и потом снова select ? Немогу найти где можно почитать про такой синтаксис
     
  11. SiUna

    SiUna Активный пользователь

    С нами с:
    1 апр 2012
    Сообщения:
    41
    Симпатии:
    0
    У меня почему то вообще не работает MAX(result), запрос выполняется, но поля result пустые, если не брать функцию max, то все result выводит.
    Код (PHP):
    1. $query = mysql_query("SELECT `user_id`, max(result)
    2. FROM `resulttest`
    3. GROUP BY `user_id`");
    4.  
    Поля result в таблице типа int(11), в чем может быть ошибка?
     
  12. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Re: Выборка из БД, вывод максимального значения при группиро

    а так max(`result`)
     
  13. SiUna

    SiUna Активный пользователь

    С нами с:
    1 апр 2012
    Сообщения:
    41
    Симпатии:
    0
    Re: Выборка из БД, вывод максимального значения при группиро

    нет, это ничего не меняет.
    [​IMG]
    А вот как если без max, но это неправильный результат
    [​IMG]
     
  14. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    Re: Выборка из БД, вывод максимального значения при группиро

    видимо вы чего-то недоговариваете. или запрос не такой (result из другой таблицы???) или обработка результатов косячная. не может max() быть пустым, если есть хоть одно непустое значение
     
  15. SiUna

    SiUna Активный пользователь

    С нами с:
    1 апр 2012
    Сообщения:
    41
    Симпатии:
    0
    Вот как выглядит структура таблицы
    [​IMG]
    Единственное что данные в неё попадают из
    Код (PHP):
    1. $result = $_POST['result']; 
    а вот тут они вроде как строковые
    Код (PHP):
    1. $query3 = mysql_query("INSERT INTO 
    2. `resulttest` 
    3. SET `user_id`='{$user_id}', 
    4. `lastname`='{$lastname}', 
    5. `group`='{$group}', 
    6. `result`='{$result}',
    7.  `lastvisit`='{$lastvisit}'") or die (mysql_error());
    8.  
    Но мне казалось, что попадая в таблицу где поле int они преобразуются под поле.
     
  16. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Re: Выборка из БД, вывод максимального значения при группиро

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

    а че не пашет - я хз.

    у вас инъекция и базу можно убить засунув в result какойнить злой запрос.
     
  17. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Код (PHP):
    1. $query = mysql_query("SELECT user_id as uid,MAX(result) as max FROM resulttest");
    2. while($q=mysql_fetch_assoc($query))
    3. {
    4.     echo $q['uid'].' -> '.$q['max'].'<br />';
    5. } 
    проверьте, а у вас вообще вот так работает?!
     
  18. SiUna

    SiUna Активный пользователь

    С нами с:
    1 апр 2012
    Сообщения:
    41
    Симпатии:
    0
    Re: Выборка из БД, вывод максимального значения при группиро

    Да, так работает, правда не совсем правильно, он вывел только одного пользователя, хотя там их 4 и у каждого есть какой то свой максимальный результат.

    Добавлено спустя 1 минуту 52 секунды:
    Re: Выборка из БД, вывод максимального значения при группировке
    Незнаю что это) я всего 2 месяца этим занимаюсь потому что надо электронный учебник для кафедры сделать с тестом. Результаты формируются внутри цикла автоматически и затем заносятся в базу после сохранения. Я сомневаюсь что кому то будет смысл ронять базу)

    Добавлено спустя 13 минут 12 секунд:
    Re: Выборка из БД, вывод максимального значения при группировке
    Кстати если этот запрос сделать чтоб работал правильно, это и будет то что мне нужно, без всяких группировок и объединений.
    Я делаю страницу рейтинга. Мне надо чтобы запрос вывел каждого пользователя с его максимальным результатом, а потом просто упорядочить
     
  19. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Re: Выборка из БД, вывод максимального значения при группиро

    ну в любом случае если текст будет с кавычками, то может просто даже не записаться корректно. так что имеет смысл воткнуть защиту.
     
  20. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    Re: Выборка из БД, вывод максимального значения при группиро

    SiUna, у вас есть phpmyadmin, прогоните запрос max() gropup by в нем, увидите, что данные ЕСТЬ. просто в скрипте вы накосячили с именами полей
     
  21. SiUna

    SiUna Активный пользователь

    С нами с:
    1 апр 2012
    Сообщения:
    41
    Симпатии:
    0
    Уже вроде итак понятно в чем проблема, когда делаешь group by, там 4 пользователя и он их вывел, но вот Max результат он показывает только одного, и просто незнает куда ставить значение вот и не выводит.
    Вот этот запрос нужный, можно обойтись без group by, но почему то он выводит только одного пользователя с максимальным значением, а нужно чтоб каждого.
     
  22. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    Re: Выборка из БД, вывод максимального значения при группиро

    ну смех и грех. "вроде понятно"
    „- Человек сидит у обрыва, - сказал он, - и рядом с ним сандалии.
    Неизбежно возникает вопрос: чьи это сандалии и где их владелец?“

    добавь group by userid :)
     
  23. SiUna

    SiUna Активный пользователь

    С нами с:
    1 апр 2012
    Сообщения:
    41
    Симпатии:
    0
    Re: Выборка из БД, вывод максимального значения при группиро

    Чем это поможет)Там итак 1 пользователь всего, там даже нечего группировать. Я его делала только для того чтобы он не выводил мне всех больше 1 раза, но раз можно вывести каждого с его максимальным результатом, то мне ненужен group by. Только вот в том запросе не получается вывести каждого почему то, выводит только одного, того у кого максимальный результат.
     
  24. SiUna

    SiUna Активный пользователь

    С нами с:
    1 апр 2012
    Сообщения:
    41
    Симпатии:
    0
    Сможет кто объяснить, почему этот запрос не выводит каждого пользователя?
    Код (PHP):
    1. $query = mysql_query("SELECT user_id as uid,MAX(result) as max FROM resulttest");
    2. while($q=mysql_fetch_assoc($query))
    3. {
    4.     echo $q['uid'].' -> '.$q['max'].'<br />';
    5. } 
    6.  
     
  25. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    Re: Выборка из БД, вывод максимального значения при группиро

    Функция MAX находит одно наибольшее значение столбца result. После такого запроса можно не делать далее while, т.к. возвратится 0 или 1 запись.