Глючит Mysql запрос или мой мозг

Тема в разделе "Базы данных", создана пользователем TrAxeX91, 17 фев 2011.

Модераторы: latteo
  1. TrAxeX91

    TrAxeX91 Создатель

    Регистр.:
    31 мар 2009
    Сообщения:
    28
    Симпатии:
    2
    Здравствуйте. Хочу задать вроде бы простой вопрос.

    делаю запрос: $max = $this->q("SELECT DISTINCT (login) FROM `operations` ORDER BY `plus` DESC LIMIT 10");

    Этот запрос выбирает уникальные логины пользователей по значению plus (это сколько выиграл пользователь). В итоге должно выводится ТОП 10 пользователей, выигрышь (plus), которых расположен по убыванию. Но этого не происходит, ORDER BY `plus` как будто не действует.

    Спасибо.
     
  2. dandandan

    dandandan

    Регистр.:
    7 авг 2008
    Сообщения:
    990
    Симпатии:
    267
    $max = $this->q("SELECT DISTINCT (login) FROM `operations` ORDER BY `plus` DESC LIMIT 10 OFFSET 0");
    или
    $max = $this->q("SELECT DISTINCT (login) FROM `operations` ORDER BY `plus` DESC LIMIT 0,10");
     
  3. TrAxeX91

    TrAxeX91 Создатель

    Регистр.:
    31 мар 2009
    Сообщения:
    28
    Симпатии:
    2
    Не работает:( На DESC нету реакции по прежнему:(
     
  4. dino

    dino

    Регистр.:
    28 май 2009
    Сообщения:
    550
    Симпатии:
    204
    Ну если я правильно понял $max это массив имён пользователей и тебе нужно, что б они были отсортированы в порядке обратном их выигрышу...
    При этом сортировка мускул запроса DESC не пашет... А ASC сортировка работает?
    если да, то просто примени к массиву $max функцию krsort($max);
     
  5. TrAxeX91

    TrAxeX91 Создатель

    Регистр.:
    31 мар 2009
    Сообщения:
    28
    Симпатии:
    2
    Сейчас попробую обьяснить по подробней.

    Структура таблицы operations:
    id plus login
    1 100 moser
    2 500 maxim
    3 900 digl
    4 300 maxim
    5 400 digl

    Таблица служит в роли истории игр. Plus - означает сколько человек выиграл. Мне нужно сделать список ТОП 10 игроков, которые выиграли самые большие суммы, достать этот список нужно непосредственно из таблицы operations.

    Я делаю вроде бы стандартный запрос:
    SELECT DISTINCT (login) FROM `operations` ORDER BY `plus` DESC LIMIT 0,10

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

    Добавлено через 15 минут
    SELECT DISTINCT (plus) FROM `operations` WHERE login<>'' ORDER BY `plus` DESC LIMIT 0,10"

    Этот запрос хорошо работает, но как сюда впихнуть, чтобы логин еще выбирался?
     
  6. dino

    dino

    Регистр.:
    28 май 2009
    Сообщения:
    550
    Симпатии:
    204
    а попробуй так:
    SELECT login FROM `operations` GROUP BY `login` ORDER BY `plus` DESC LIMIT 0,10
     
  7. dandandan

    dandandan

    Регистр.:
    7 авг 2008
    Сообщения:
    990
    Симпатии:
    267
    Сделайте тип поля plus - integer. Возможно тип стоит varchar или еще какой-нибудь другой.

    А вообще неплохо было бы указать тип всех полей и привести тестовую выборку из того, что есть в базе данных и того, что получается при выборке.
     
  8. pslava

    pslava

    Регистр.:
    16 май 2007
    Сообщения:
    618
    Симпатии:
    122
    SELECT login, MAX(plus) FROM `operations` GROUP BY login ORDER BY 2 DESC LIMIT 10
    или
    SELECT login, MIN(plus) FROM `operations` GROUP BY login ORDER BY 2 DESC LIMIT 10
    в зависимости хочешь выбирать минимальный или максимальный выигрыш пользователя за 1 игру, а если нужно за все время - то
    SELECT login, SUM(plus) FROM `operations` GROUP BY login ORDER BY 2 DESC LIMIT 10
    Думаю тебе подходит 1-й запрос